你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux线程间用信号量通信

[日期:2012-08-01] 来源:Linux社区  作者:huangyekan [字体: ]

原来总是用互斥锁(MUTEX)和环境变量(cond)去控制线程的通信,用起来挺麻烦的,用信号量(SEM)来通信控制就方便多了!

用到信号量就要包含semaphore.h头文件。

可以用sem_t类型来声明一个型号量。

用int sem_init(sem_t *sem, int pshared, unsigned int value)函数来初始化型号量,第一个参数就是用sem_t声明的信号量,第二变量如果为0,表示这个信号量只是当前进程中的型号量,如果不为0,这个信号量可能可以在两个进程中共享。第三个参数就是初始化信号量的多少值。

sem_wait(sem_t *sem)函数用于接受信号,当sem>0时就能接受到信号,然后将sem--;

sem_post(sem_t *sem)函数可以增加信号量。

sem_destroy(sem_t *sem)函数用于解除信号量。

以下是一个用信号控制的一个简单的例子。

  1. #include <stdio.h>   
  2. #include <semaphore.h>   
  3. #include <pthread.h>   
  4. sem_t sem1, sem2;  
  5.   
  6. void *thread1(void *arg)  
  7. {  
  8.     sem_wait(&sem1);  
  9.     setbuf(stdout,NULL);//这里必须注意,由于下面输出"hello"中没有‘\n’符,所以可能由于输出缓存已满,造成输不出东西来,所以用这个函数把输出缓存清空   
  10.     printf("hello ");  
  11.     sem_post(&sem2);  
  12. }  
  13.   
  14. void *thread2(void *arg)  
  15. {  
  16.     sem_wait(&sem2);  
  17.     printf("world!\n");   
  18. }  
  19.   
  20. int main()  
  21. {  
  22.     pthread_t t1, t2;     
  23.       
  24.     sem_init(&sem1,0,1);  
  25.     sem_init(&sem2,0,0);  
  26.       
  27.     pthread_create(&t1,NULL,thread1,NULL);  
  28.     pthread_create(&t2,NULL,thread2,NULL);  
  29.   
  30.     pthread_join(t1,NULL);  
  31.     pthread_join(t2,NULL);  
  32.   
  33.     sem_destroy(&sem1);  
  34.     sem_destroy(&sem2);  
  35.       
  36.     return 0;         
  37. }  

程序的实现是控制先让thread1线程打印"hello "再让thread2线程打印"world!".  

linux
相关资讯       Linux多线程编程 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款