博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux多线程程序设计
阅读量:4286 次
发布时间:2019-05-27

本文共 3580 字,大约阅读时间需要 11 分钟。

线程:线程可以理解为“轻量级”的进程,它与创建它的进程共享代码段和数据段,同时拥有自己独立的栈。

线程私有的资源有:栈、寄存器、状态、程序计数器;
线程间共享的资源有:堆,全局变量,静态变量;
进程占有的资源有:地址空间,全局变量,打开的文件,子进程,信号量、账户信息。

pthread_create

原型:int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg)头文件:
,编译时需要链接pthread库功能:创建新的线程,成功返回0,失败返回错误编号参数:thread:用来存储新创建的线程id attr:一个指向pthread_attr_t结构的指针,指向的结构决定了新创建的线程的属性,如优先级等。可为NULL,表示采用默认属性。 start_routine:函数指针。创建线程与创建进程后的执行情况不同。创建进程后,子进程顺着代码执行下去,而创建线程,线程是从一个指定的函数入口开始执行。start_routine指向了线程的函数入口 arg:线程函数入口需要一个参数void *,arg就是该参数,可为NULL

多进程程序中,父进程的退出不会导致子进程的退出;而在多线程程序中,进程结束时,该进程所创建的线程也会结束运行。所以多线程程序中进程需要等待其线程结束才能结束。

pthread_join

原型:int pthread_join(pthread_t thread,void *retval)头文件:
编译时需要链接pthread库功能:等待线程结束,成功返回0,失败返回错误编号参数:thread:要等待结束的线程的id retval:保存线程结束时的状态,一般为NULL

pthread_exit

原型:void pthread_exit(void *retval)头文件:
编译时需要链接pthread库功能:结束线程参数:retval:线程返回的值,可与pthread_join中的参数retval配合使用,但一般设为NULL

在实际应用中,多个线程往往会访问同一数据或资源,为避免线程之间相互影响,需要引入线程互斥机制,而互斥锁是互斥机制中的一种。

pthread_mutex_init

原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr)头文件:
功能:初始化互斥锁,成功返回0,失败返回错误编号参数:mutex:要初始化的互斥锁的指针 attr:用于设置互斥锁的属性,一般设为NULL,表示默认属性

pthread_mutex_lock

原型:int pthread_mutex_lock(pthread_mutex_t *mutex)头文件:
功能:获取互斥锁,成功返回0,失败返回错误编号参数:mutex:要获取的互斥锁的指针

pthread_mutex_unlock

原型:int pthread_mutex_unlock(pthread_mutex_t *mutex)头文件:
功能:释放互斥锁,成功返回0,失败返回错误编号参数:mutex:要获取的互斥锁的指针

线程互斥

线程互斥:进程创建出两个线程,两个线程互斥

#include
#include
pthread_mutex_t mutex;pthread_t thread[2];int number=0;void* work1(){ int i; for(i=0;i<10;i++) { pthread_mutex_lock(&mutex); number++; printf("work1:%d\n",number); pthread_mutex_unlock(&mutex); sleep(1); } pthread_exit(NULL);}void* work2(){ int i; for(i=0;i<10;i++) { pthread_mutex_lock(&mutex); number++; printf("work2:%d\n",number); pthread_mutex_unlock(&mutex); sleep(1); } pthread_exit(NULL);}void main(){ /*初始化互斥锁*/ pthread_mutex_init(&mutex,NULL); /*创建线程1*/ pthread_create(&thread[0],NULL,work1,NULL); /*创建线程2*/ pthread_create(&thread[1],NULL,work2,NULL); /*等待线程1结束*/ pthread_join(thread[0],NULL); /*等待线程2结束*/ pthread_join(thread[1],NULL);}

线程同步

多个线程按照规定的顺序执行,即为线程同步。线程同步可利用全局变量来实现,但这会导致执行效率低下,应采用专用的函数来实现同步。

初始化:pthread_cond_t cond_ready=PTHREAD_COND_INITIALIZER;等待条件成熟:pthread_cond_wait(&cond_ready, &mut);设置条件成熟:pthread_cond_signal(&cond_ready);

线程同步:进程创建了两个线程,其中线程work2必须在线程work1执行完后才执行

#include
#include
pthread_mutex_t mutex;pthread_t thread[2];int number=0;pthread_cond_t cond_ready=PTHREAD_COND_INITIALIZER;void* work1(){ while(1) { pthread_mutex_lock(&mutex); number++; printf("work1:%d\n",number); pthread_mutex_unlock(&mutex); if(number==5) { pthread_cond_signal(&cond_ready);/*发送信号,说明条件成熟*/ break; } sleep(1); } pthread_exit(NULL);}void* work2(){ pthread_mutex_lock(&mutex); if(number<5) { pthread_cond_wait(&cond_ready, &mutex);/*需要配合着互斥锁使用,当条件不成熟时会自动释放互斥锁,从而使其它进程能够获取互斥锁*/ } number=0; printf("work2:%d\n",number); pthread_mutex_unlock(&mutex); pthread_exit(NULL);}void main(){ /*初始化互斥锁*/ pthread_mutex_init(&mutex,NULL); /*创建线程1*/ pthread_create(&thread[0],NULL,work1,NULL); /*创建线程2*/ pthread_create(&thread[1],NULL,work2,NULL); /*等待线程1结束*/ pthread_join(thread[0],NULL); /*等待线程2结束*/ pthread_join(thread[1],NULL);}

转载地址:http://qmigi.baihongyu.com/

你可能感兴趣的文章
IE 8兼容:X-UA-Compatible的解释
查看>>
关于form.submit()不能提交表单的错误原因
查看>>
初识HTML 5:关于它的三个三
查看>>
Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形
查看>>
Canvas入门(2):图形渐变和图像形变换
查看>>
Canvas入门(3):图像处理和绘制文字
查看>>
《千与千寻》给读者带来了什么?
查看>>
JQuery笔记:JQuery和JavaScript的联系与区别
查看>>
PHP的MySQL扩展:PHP访问MySQL的常用扩展函数
查看>>
PHP实现分页:文本分页和数字分页
查看>>
博客收录集的源代码分享,需要那就快来吧
查看>>
杂谈:HTML 5的消息通知机制
查看>>
Ajax异步请求PHP数据
查看>>
百家搜索:在网站中添加Google、百度等搜索引擎
查看>>
关于坛友的一个布局问题的解答
查看>>
网页抓取:PHP实现网页爬虫方式小结
查看>>
国民岳父的“屁民理论”
查看>>
我为什么要写博客?
查看>>
博客测试:博客系统i94web beta1.0 请求测试
查看>>
XAMPP:访问phpmyadmin出错的解决方案
查看>>