- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux线程控制函数分析
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
您可能关注的文档
最近下载
- (word完整版)10kV配电安装工程施工方案.docx VIP
- 养老院安全突发事件应急预案.docx VIP
- 【沙利文】全球及中国生物试剂市场独立研究报告.pdf
- 计算机软件著作权成果转化合同8篇.docx VIP
- 论刑法中的多次犯罪-法律(法学)专业论文.docx VIP
- 2022浙ST19壁挂式轻便消防水龙及室内消火栓安装.pdf VIP
- 2025年小升初语文总复习:记叙文阅读附答案解析.doc VIP
- 《GB/T 20882.3-2021淀粉糖质量要求 第3部分:结晶果糖、固体果葡糖》.pdf
- 高中物理带电粒子在电场中的运动典型例题解析.docx VIP
- 公司员工在职证明模板.docx VIP
文档评论(0)