如果我有
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 ++。
重要提示:目标是了解此特定情况的同步机制或算法,而不是互斥锁或信号量的工作原理。
答案 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
上。在这种特殊情况下,您不必担心死锁。只是:
mutex_A
输入MainThread
; Thread1
等待释放互斥锁。MainThread
离开互斥锁; Thread1
输入mutex_A
和mutex_Buffer
,开始阅读A
并将其写入Buffer
。Thread1
释放两个互斥锁。 ThreadMain
可以输入mutex_A
并撰写数据,Thread2
可以mutex_Buffer
安全地从Buffer
读取数据。这显然是最简单的解决方案,可能会有所改进,但如果没有更多关于问题的知识,这是我能想到的最好的解决方案。