- 1、本文档共30页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.4 信号量线程控制 信号量也就是操作系统中所用到的PV操作,它广泛用于进程或线程间的互斥与同步。 PV操作是对整数计数器信号量sem的操作。一次P操作使sem减一,一次V操作使sem加一。 用于互斥时,几个进程(或线程)往往只设置一个信号量sem。 用于同步时,往往设置多个信号量,并安排不同的值了来实现它们之间的顺序执行。 开始 初始化信号量 V操作 V操作 线程二执行 线程一执行 P操作 P操作 结束 图2 信号量互斥操作 开始 初始化信号量 V操作sem1 V操作sem2 线程二执行 线程一执行 P操作sem1 P操作sem2 结束 图3 信号量同步操作 Linux实现了POSIX.1的无名信号量,用于线程的同步与互斥。 信号量操作函数: sem_init:用于创建一个信号量,并初始化它。 sem_wait或sem_trywait: 相当于P操作,它们都能使信号量减一,两者区别在于当信号量小于零时,sem_wait会阻塞,而sem_trywait则会立即返回。 sem_post:相当于V操作,它将信号量的值加一同时发出信号唤醒等待的进程。 sem_getvalue:得到信号量的值。 sem_destroy:删除信号量。 创建信号量 所需头文件 #include semaphore.h 函数原型 int sem_init(sem_t *sem,int pshared,unsigned int value) 函数传入值 sem:信号量指针 pshared:决定信号量能否在几个进程间共享。由于目前Linux还没有实现进程间共享信号量,所以这个值只能够取0,就表示这个信号量是当前进程的局部信号量 value:信号量初始化值 函数返回值 成功:0 出错:?1 其他信号量函数 所需头文件 #include pthread.h 函数原型 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) 函数传入值 sem:信号量指针 函数返回值 成功:0 出错:?1 线程实例二 #include stdio.h #include stdlib.h #include pthread.h #include semaphore.h #define THREAD_NUMBER 3 /*线程数*/ #define REPEAT_NUMBER 3 /*每个线程中的小任务数*/ #define DELAY_TIME_LEVELS 10.0 /*小任务之间的最大时间间隔*/ ?sem_t sem[THREAD_NUMBER]; void *thrd_func(void *arg) { int thrd_num = (int)arg; int delay_time = 0; int count = 0; /* 进行P操作 */ sem_wait(sem[thrd_num]); printf(Thread %d is starting\n, thrd_num); for (count = 0; count REPEAT_NUMBER; count++) { delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX)) + 1; sleep(delay_time); printf(\tThread %d: job %d delay = %d\n, thrd_num, count, delay_time); } ? printf(Thread %d finished\n, thrd_num); pthread_exit(NULL); } int main(void) { pthread_t thread[THREAD_NUMBER]; int no = 0, res; void * thrd_ret; srand(time(NULL)); for (no = 0; no THREAD_NUMBER; no++) { sem_init(sem[no], 0, 0); res = pthre
您可能关注的文档
最近下载
- 履带吊拆卸安装方案.doc
- 如何拍摄公务活动.ppt
- 2024届高三化学一轮复习 说题比赛—2023年高考化学全国新课标卷28题 课件.pptx VIP
- 某医院电动自行车消防安全综合治理工作实施方案.docx VIP
- 探究计算机中的数据表示.docx VIP
- 安全文明工地创优计划(1).doc
- 比亚迪s6维修维修手册(近光灯不亮).pdf VIP
- “线上+线下”混合教学模式在小学心育课中的应用-来源:基础教育参考(第2020011期)-教育部教育管理信息中心.pdf VIP
- SYT 7412-2018-油气长输管道突发事件应急预案编制规范.pdf
- 马克思主义基本原理-华东师范大学-中国大学MOOC慕课答案.pdf
文档评论(0)