Linux线程间用信号量通信

原来总是用互斥锁(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公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-08/66985.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值