我查找过的几乎所有资源都谈到了如何强制互斥或处理生产者/消费者问题。
问题是我需要让某些线程在其他线程之前执行,但无法弄清楚如何。我正在尝试使用信号量,但在我的情况下,我们并没有真正看到他们如何提供帮助。
我有
读取线程用数据填充缓冲区,然后搜索线程解析数据并将其输出到另一个缓冲区,然后写入线程将写入文件。
知道如何实现这一目标吗?
如果有人认为这有用,我可以发布我目前的代码。
答案 0 :(得分:0)
我认为你要找的是monitor
答案 1 :(得分:0)
我会使用一些条件变量。
你有阅读缓冲区。大概两个。如果搜索线程很慢,您希望读取等待而不是使用缓冲区上的所有内存。
所以:read_ready条件变量和read_ready_mutex。当有一个打开的缓冲区时设置为true。
下一篇:search_ready条件变量和search_ready_mutex。当有完整的读缓冲区时设置为true。
Next:write_ready变量和write_ready互斥锁。当有写作线程的工作时设置为true。
而不是true / false,您可以使用已准备好的缓冲区数量的整数。只要在保持互斥锁时验证条件并且仅在保持互斥锁时修改条件,它就会起作用。
答案 2 :(得分:0)
[评论太长]
将其减少到两个假设:
我总结道:
答案 3 :(得分:0)
一般来说,当我们不关心执行顺序时,就会精确地使用线程。 如果你想按顺序执行一些语句S1,S2,...,SN,那么你可以将它们安排到一个由单个线程运行的程序中:{S1; S2; ...; SN}。
您描述的具体问题可以通过称为障碍的同步原语(作为POSIX函数pthread_barrier_wait
实现)来解决。
屏障用数字初始化,屏障数N.调用屏障等待操作的线程暂停,直到N个线程累积。然后他们都被释放了。其中一个线程接收一个返回值,告诉它它是“串行线程”。
因此,例如,假设我们有N个线程执行此读取,并行处理和写入序列。它就像这样(伪代码):
i_am_serial = barrier.wait(); # at first, everyone waits at the barrier
if (i_am_serial) # serial thread does the reading, preparing the data
do_read_task();
barrier.wait(); # everyone rendezvous at the barrier again
do_paralallel_processing(); # everyone performs the processing on the data
i_am_serial = barrier.wait(); # rendezvous after parallel processing
if (i_am_serial)
do_write_report_task(); # serialized integration and reporting of results