如何同步三个依赖线程

时间:2012-01-24 15:09:42

标签: c++ multithreading thread-safety multiprocessing multitasking

如果我有

1. mainThread: write data A, 
2. Thread_1: read A and write it to into a Buffer;
3. Thread_2: read from the Buffer.

如何安全地同步这三个线程,性能损失不大?有没有现成的解决方案?我在linux上使用C / C ++。

重要提示:目标是了解此特定情况的同步机制或算法,而不是互斥锁或信号量的工作原理。

3 个答案:

答案 0 :(得分:4)

首先,我考虑将这个构建为三个独立进程的可能性,使用管道连接它们。管道(本质上)是一个小缓冲区,内核自动处理锁定。如果您最终使用线程,那么大部分时间/精力将用于创建几乎完全复制已内置到内核中的管道。

其次,如果您决定自己构建这一切,我会认真考虑遵循类似的模型。你不需要对它嗤之以鼻,但我仍然主要考虑一个线程写入数据的数据结构,以及另一个线程从中读取数据的数据结构。通过强烈的偏好,所有必要的线程锁定都将构建到该数据结构中,因此线程中的大多数代码都非常简单,即读取,处理和写入数据。与使用普通Unix管道的主要区别在于,在这种情况下,您可以以更方便的格式维护数据,而不是所有的文本读写。

因此,我认为你正在寻找的基本上是一个线程安全的队列。有了它,几乎所有其他涉及的东西都变得微不足道(至少它的线程部分 - 所涉及的处理可能不是,但至少用多个线程构建它并没有增加复杂性)。

答案 1 :(得分:1)

很难说你有多少C / C ++线程的经验。我不想指向一个链接,但是你已经阅读了pthreads

https://computing.llnl.gov/tutorials/pthreads/

对于代码和简单互斥锁的简短示例(锁定对象,您需要同步数据):

http://students.cs.byu.edu/~cs460ta/cs460/labs/pthreads.html

答案 2 :(得分:1)

为此,我建议Boost.Thread。这是一个非常好的框架,有互斥锁和信号量,它是多平台的。 Here你可以找到关于此的非常好的教程。

完全如何同步这些线程是另一个问题,需要有关您的问题的更多信息。


编辑最简单的解决方案是放置两个互斥锁 - 一个放在A上,第二个放在Buffer上。在这种特殊情况下,您不必担心死锁。只是:

  1. mutex_A输入MainThread; Thread1等待释放互斥锁。
  2. MainThread离开互斥锁; Thread1输入mutex_Amutex_Buffer,开始阅读A并将其写入Buffer
  3. Thread1释放两个互斥锁。 ThreadMain可以输入mutex_A并撰写数据,Thread2可以mutex_Buffer安全地从Buffer读取数据。
  4. 这显然是最简单的解决方案,可能会有所改进,但如果没有更多关于问题的知识,这是我能想到的最好的解决方案。