zthread学习 实例十 线程间的协助(二)

时间:2022-02-01 23:39:26

例一、生产者-消费者

 

 

一个任务制作烤面包(生产者),一个任务给烤面包抹黄油(消费者),还有一个任务是往抹好黄油的烤面包上抹果酱(消费者)。

代码如下:

 

 

 

 

线程处理问题常常基于需要对任务进行串行化处理。使用队列可以采用同步的方式访问其内部元素,这样可以解决很多线程处理问题,下面基于STL中的deque实现的队列:

 

 

1、加入同步以确保在同一时刻不会有两个线程添加对象。

2、加入wait()和signal()在队列空时,挂起线程,并在有多个元素可用时恢复执行。

 

 

 

二、广播

 

signal()函数唤醒了一个正在等待Condition对象的线程。然而,也许会有多个线程在等待某个相同的条件对象,在这种情况下需要使用broadcast()(与调用线程的个数的signal()效果相同)而不是signal()把这些线程唤醒。

 

 

 

使用广播的例子:每辆Car将在几个阶段内装配完成,本例中将看到这样一个阶段:底盘制作好之后的这段时间里可以 同时 安装发动机、驱动传动装置和车轮(广播)。本例中综合中前面中所有关于线程的知识。