生产者和消费者问题个人总结

1.可以通过互斥量+信号量的形式以及互斥量+条件变量的形式实现。

2.实现互斥的P操作一定要在实现同步的P操作之后。 V操作不会导致进程阻塞,因此两个V操作顺序可以交换。

同时,我们发现,当互斥量与条件变量配合使用的时候,则是互斥量在前,pthread_cond_wait()在后,这是因为,pthread_cond_wait()函数是个原子操作,如出现阻塞,则会先将互斥量解锁,不会出现死锁的情况。

3.PV操作的解题思路:

关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)

4.假醒

使用while而不是if,这仍然是因为pthread_cond_wait会京mutex解锁原因,判断这个时候,是否有其他同类线程已经“捷足先登”了,导致又没资源了。

 while( !spaces ) {  // 避免“惊群”效应,避免因其他线程实现得到事件而导致该线程“假醒”
            pthread_cond_wait( &notfull, &mutex );
        }

5.phtread_cond_wait是阻塞等待,也就是说,如果没有pthread_cond_signal唤醒他,他就会一直在阻塞。

void *function1()
{
	while(1)
	{
		pthread_mutex_lock(&lock);
		printf("=====  线程1进入睡眠        ====\n");
		pthread_cond_wait(&cond,&lock);
		printf("====  线程1    唤醒    ====\n");
		pthread_mutex_unlock(&lock);
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值