- 1、本文档共29页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
线程学习日志剖析
线程学习日志计科3班朱程概述线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。线程的基本操作1创建线程intpthread_create(pthread_t *restrict tidp,constpthread_attr_t *restritattr,void *(*start_rtn)(void),void *restrict arg);当函数返回时,tidp指向内核分配给线程的ID,attr表示线程的属性,一般设为NULL,start_rtn是个函数指针,start_rtn指向的函数是线程要执行的函数,一旦pthread_create成功返回,线程创建,就从start_rtn指向的函数开始执行代码。当从这个函数返回时,线程就停止运行了。arg是start_rtn所指向的函数的参数,在线程开始执行时,该参数由内核负责传递给线程。pthread_create函数成功调用返回0.如果创建线程失败,返回的是错误编号2.向线程体函数传递参数pthread_creat函数在创建线程时由内核向新线程传递参数,如果需要传递多个参数则需要将所有参数组织在一个结构体内,再将结构体的地址作为参数传给新线程。案例:#include stdio.h#include stdlib.h#include string.h#include pthread.h#define BUFS PIPE_BUF //PIPE_BUF管道默认一次性读写的数据长度structarg_struct {char arg1[10];int arg2;float arg3;};typedefstructarg_struct ARG;void *thread_func(void *arg){ ARG *p=(ARG *)arg;printf(arg1 is : %s,arg2 is:%d, arg3 is :%f\n,p-arg1,p-arg2,p-arg3); return NULL;}int main(intargc,char *argv[]){pthread_ttid; ARG arg;int err; //对三个参数赋值,在创建线程之前strcpy(arg.arg1,argv[1]); arg.arg2 = atoi(argv[2]); arg.arg3 = atof(argv[3]);err = pthread_create(tid,NULL,thread_func,(void *)arg); //创建线程,并传递参数if(err !=0) {printf(create thread thread_func failed:%s\n,strerror(err));exit(1);} pthread_join(tid,0);//等待子线程结束return 0;}运行结果:3.线程访问资源的限制在线程执行的过程中可以访问进程的资源,下面的例子在main函数创建了一个结构体,并初始化之,该结构体既有栈数据成员指针,又有堆数据成员指针。main线程睡眠5s,让子线程先执行,在线程thread_func()执行后,结构体数据增加。main线程使用的是已经发生改变的数据。例子:#include stdio.h#include stdlib.h#include pthread.htypedefstructarg_struct{int *heap;int *stack;}ARG;FILE *fp=NULL;void *thread_func(void *arg){ ARG *p; p=(ARG *)arg; (*p-heap)++;
文档评论(0)