Linux应用开发之信号量

信号量跟前面说的锁机制差不多,都是对线程间同步机制的一种方法。信号量用到的函数有以下几种:
int sem_init(sem_t *sem, int pshared, unsigned int value);//对信号量的初始化函数
sem:定义的信号量
pshared:定义信号是否被分享。0、分享,非0不分享
value:value的值用来初始化定义的信号量
int sem_destroy(sem_t *sem);//销毁信号量
int sem_post(sem_t *sem);//发送信号量
int sem_wait(sem_t sem);//等待信号量的到来
信号量用到的函数基本上就这么多,下面用一个具体的例子来看一下这个信号量与多线程的配合使用。
#include<semaphore.h>
#include<pthread.h>
#include<stdio.h>
sem_t sem,sem1;//创建两个信号量
int p=0;
void
do1()
{
while(1)
{
sem_wait(&sem1);//等待信号量发送
printf(“prodece recv p = %d\n”,p);
p = rand()%10;
printf(“produce p = %d\n”,p);
sem_post(&sem);//发送信号量
sleep(1);
}

}
voiddo2()
{
while(1)
{
sem_wait(&sem);
printf(“recv p = %d\n”,p);
p=0;//再接收到产生的随机数后把p清零然后向线程发送信号量
sem_post(&sem1);
sleep(1);
}
}
int main()
{
pthread_t pid[2];
sem_init(&sem,0,0);//初始化信号量
sem_init(&sem1,0,0);
sem_post(&sem1);//先发送一个指定的信号量,不然两个线程会阻塞的等待信号量的到来
pthread_create(&pid[0],NULL,do1,NULL);//创建线程
pthread_create(&pid[1],NULL,do2,NULL);
pthread_join(pid[0],NULL);//线程的回收,避免僵尸线程
pthread_join(pid[1],NULL);
sem_destroy(&sem);//使用结束后要把信号量给回收
sem_destroy(&sem1);
return 0;
}
运行结果:
在这里插入图片描述
每次void
do1()函数接收到信号量的时候,p的值都会为0,然后产生一个随机数再把信号量发送给voiddo2()函数,这个函数打印出P的值后再把P清零,然后向voiddo1()函数发送信号量,是一个圈。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值