- 所以首先你所有的 N 个工作线程都必须进入“就绪模式”
- 您的刺激线程发送刺激。(它必须等到所有其他人都准备好)
- 然后所有线程应该开始工作。
因此,在 1 和 2 之间,您需要一个信号量(初始计数 0,最大计数 nThreads),每个工作线程发出一次信号,并由刺激线程等待 N 次。
在 2. 和 3. 之间,您还需要同步,因为工作线程应该等到刺激线程发送了他的刺激。这也可以通过每个工作线程的信号量(初始计数 0 最大计数 1)来实现。
刺激线程的伪代码:
init stimulus-semaphore and one semaphore for each worker-thread
start threads
while (1) {
for (int i=0;i<nThreads;i++)
wait for stimulus-semaphore
do the stimulus-thing
for (int i=0;i<nThreads;i++)
signal threads[i] semaphore
}
工作线程的伪代码:
while (1) {
signal stimulus-semaphore
wait for this threads semaphore
do the work to be done after stimulus was sent
}