如何让线程按特定顺序执行?

时间:2014-03-07 20:37:04

标签: c multithreading pthreads

我查找过的几乎所有资源都谈到了如何强制互斥或处理生产者/消费者问题。

问题是我需要让某些线程在其他线程之前执行,但无法弄清楚如何。我正在尝试使用信号量,但在我的情况下,我们并没有真正看到他们如何提供帮助。

我有

  • 阅读帖子,
  • N个搜索主题和
  • 写线程。

读取线程用数据填充缓冲区,然后搜索线程解析数据并将其输出到另一个缓冲区,然后写入线程将写入文件。

知道如何实现这一目标吗?

如果有人认为这有用,我可以发布我目前的代码。

4 个答案:

答案 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