Linux信号量线程控制--培训教程

上传人:m**** 文档编号:505554567 上传时间:2022-12-15 格式:DOC 页数:6 大小:27KB
返回 下载 相关 举报
Linux信号量线程控制--培训教程_第1页
第1页 / 共6页
Linux信号量线程控制--培训教程_第2页
第2页 / 共6页
Linux信号量线程控制--培训教程_第3页
第3页 / 共6页
Linux信号量线程控制--培训教程_第4页
第4页 / 共6页
Linux信号量线程控制--培训教程_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《Linux信号量线程控制--培训教程》由会员分享,可在线阅读,更多相关《Linux信号量线程控制--培训教程(6页珍藏版)》请在金锄头文库上搜索。

1、真诚为您提供优质参考资料,若有不当之处,请指正。信号量线程控制(1)信号量说明在第8 章中已经讲到,信号量也就是操作系统中所用到的PV 原语,它广泛用于进程或线程间的同步与互斥。信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。这里先来简单复习一下PV原语的工作原理。PV原语是对整数计数器信号量sem的操作。一次P操作使sem减一,而一次V操作使嵌入式Linux应用程序开发详解第9章、多线程编程sem 加一。进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。当信号量sem 的值大于等于零时,该进程(或线程)具有公共资源的访问权限;相反,当信号量sem的值小于零时,该

2、进程(或线程)就将阻塞直到信号量sem的值大于等于0 为止。PV 原语主要用于进程或线程间的同步和互斥这两种典型情况。若用于互斥,几个进程(或线程)往往只设置一个信号量sem,它们的操作流程如图9.2 所示。当信号量用于同步操作时,往往会设置多个信号量,并安排不同的初始值来实现它们之间的顺序执行,它们的操作流程如图9.3所示。图9.2 信号量互斥操作华清远见培_训教材图9.3 信号量同步操作(2)函数说明Linux 实现了POSIX 的无名信号量,主要用于线程间的互斥同步。这里主要介绍几个常见函数。 sem_init用于创建一个信号量,并能初始化它的值。 sem_wait和sem_trywai

3、t相当于P操作,它们都能将信号量的值减一,两者的区别在于若信号量小于零时,sem_wait将会阻塞进程,而sem_trywait则会立即返回。 sem_post相当于V操作,它将信号量的值加一同时发出信号唤醒等待的进程。 sem_getvalue用于得到信号量的值。 sem_destroy用于删除信号量。(3)函数格式表 9.11 列出了sem_init函数的语法要点。表9.11 sem_init函数语法要点所需头文件#include 嵌入式Linux应用程序开发详解第9章、多线程编程函数原型int sem_init(sem_t *sem,int pshared,unsigned int va

4、lue)sem:信号量pshared:决定信号量能否在几个进程间共享。由于目前Linux还没有实现进程间共享信号量,所以这个值只能够取0函数传入值value:信号量初始化值成功:0函数返回值出错:-1表 9.12 列出了sem_wait等函数的语法要点。表9.12 sem_wait等函数语法要点所需头文件#include 函数原型int sem_wait(sem_t *sem)int sem_trywait(sem_t *sem)int sem_post(sem_t *sem)int sem_getvalue(sem_t *sem)int sem_destroy(sem_t *sem)函数传入

5、值sem:信号量成功:0函数返回值出错:-1(4)使用实例下面实例1 使用信号量实现了上一实例中对lock_var 的操作,在这里使用的是互斥操作,也就是只使用一个信号量来实现。代码如下所示:/*sem_mutex.c*/#include #include #include #include #include #include #include int lock_var;time_t end_time;sem_t sem;void pthread1(void *arg);void pthread2(void *arg);int main(int argc, char *argv)pthread

6、_t id1,id2;pthread_t mon_th_id;int ret;end_time = time(NULL)+30;/*初始化信号量为1*/ret=sem_init(&sem,0,1);if(ret!=0)perror(sem_init);/*创建两个线程*/ret=pthread_create(&id1,NULL,(void *)pthread1, NULL);if(ret!=0)perror(pthread cread1);ret=pthread_create(&id2,NULL,(void *)pthread2, NULL);if(ret!=0)perror(pthread

7、cread2);pthread_join(id1,NULL);pthread_join(id2,NULL);exit(0);void pthread1(void *arg)int i;while(time(NULL) end_time)/*信号量减一,P操作*/sem_wait(&sem);for(i=0;i2;i+)sleep(1);lock_var+;printf(lock_var=%dn,lock_var);printf(pthread1:lock_var=%dn,lock_var);/*信号量加一,V操作*/sem_post(&sem);嵌入式Linux应用程序开发详解第9章、多线程编

8、程sleep(1);void pthread2(void *arg)int nolock=0;int ret;while(time(NULL) end_time)/*信号量减一,P操作*/sem_wait(&sem);printf(pthread2:pthread1 got lock;lock_var=%dn,lock_var);/*信号量加一,V操作*/sem_post(&sem);sleep(3);程序运行结果如下所示:root(none) tmp# ./sem_numlock_var=1lock_var=2pthread1:lock_var=2pthread2:pthread1 got

9、lock;lock_var=2lock_var=3lock_var=4pthread1:lock_var=4pthread2:pthread1 got lock;lock_var=4接下_来是通过两个信号量来实现两个线程间的同步,仍然完成了以上实例中对lock_var的操作。代码如下所示:/*sem_syn.c*/#include #include #include #include #include #include #include int lock_var;time_t end_time;sem_t sem1,sem2;void pthread1(void *arg);void pthr

10、ead2(void *arg);int main(int argc, char *argv)pthread_t id1,id2;pthread_t mon_th_id;int ret;end_time = time(NULL)+30;/*初始化两个信号量,一个信号量为1,一个信号量为0*/ret=sem_init(&sem1,0,1);ret=sem_init(&sem2,0,0);if(ret!=0)perror(sem_init);/*创建两个线程*/ret=pthread_create(&id1,NULL,(void *)pthread1, NULL);if(ret!=0)perror(

11、pthread cread1);ret=pthread_create(&id2,NULL,(void *)pthread2, NULL);if(ret!=0)perror(pthread cread2);pthread_join(id1,NULL);pthread_join(id2,NULL);exit(0);void pthread1(void *arg)int i;while(time(NULL) end_time)/*P操作信号量2*/sem_wait(&sem2);嵌入式Linux应用程序开发详解第9章、多线程编程for(i=0;i2;i+)sleep(1);lock_var+;pri

12、ntf(lock_var=%dn,lock_var);printf(pthread1:lock_var=%dn,lock_var);/*V操作信号量1*/sem_post(&sem1);sleep(1);void pthread2(void *arg)int nolock=0;int ret;while(time(NULL) end_time)/*P操作信号量1*/sem_wait(&sem1);printf(pthread2:pthread1 got lock;lock_var=%dn,lock_var);/*V操作信号量2*/sem_post(&sem2);sleep(3);从以下结果中可以看出,该程序确实实现了先运行线程二,再运行线程一。root(none) tmp# ./sem_numpthread2:pthread1 got lock;lock_var=0lock_var=1lock_var=2pthread1:lock_var=2pthread2:pthread1 got lock;lock_var=2lock_var=3lock_var=4pthread1:lock_var=4 /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号