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)函数用于解除信号量。
以下是一个用信号控制的一个简单的例子。
- #include <stdio.h>
- #include <semaphore.h>
- #include <pthread.h>
- sem_t sem1, sem2;
- void *thread1(void *arg)
- {
- sem_wait(&sem1);
- setbuf(stdout,NULL);//这里必须注意,由于下面输出"hello"中没有‘\n’符,所以可能由于输出缓存已满,造成输不出东西来,所以用这个函数把输出缓存清空
- printf("hello ");
- sem_post(&sem2);
- }
- void *thread2(void *arg)
- {
- sem_wait(&sem2);
- printf("world!\n");
- }
- int main()
- {
- pthread_t t1, t2;
- sem_init(&sem1,0,1);
- sem_init(&sem2,0,0);
- pthread_create(&t1,NULL,thread1,NULL);
- pthread_create(&t2,NULL,thread2,NULL);
- pthread_join(t1,NULL);
- pthread_join(t2,NULL);
- sem_destroy(&sem1);
- sem_destroy(&sem2);
- return 0;
- }
程序的实现是控制先让thread1线程打印"hello "再让thread2线程打印"world!".
相关推荐
hackerlpy 2020-09-25
猛禽的编程艺术 2020-06-08
神龙 2020-06-07
安得情怀似旧时 2020-04-20
insularisland 2019-11-05
GeorgeTH 2019-10-29
kuailexiaochuan 2015-04-11
playlinuxxx 2016-07-30
zjhqlmzldx 2011-06-02
学峰的学习笔记 2010-09-26
starinshy 2020-11-10
archimedes 2020-11-05
farwang 2020-04-20
RayCongLiang 2019-12-29
wanggongzhen 2020-01-09
Attend 2010-09-04
goawalk 2011-03-24
shipinsky 2019-11-05
Proudoffaith 2019-10-28
过儿古墓 2011-05-26
hehuistudent 2008-09-11