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++。
重要提示:目标是了解这种特殊情况下的同步机制或算法,而不是互斥或信号量如何工作。
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++。
重要提示:目标是了解这种特殊情况下的同步机制或算法,而不是互斥或信号量如何工作。
首先,我会考虑将此作为三个独立进程构建的可能性,并使用管道来连接它们。管道(本质上)是一个小缓冲区,内核自动处理锁定。如果你最终为此使用线程,大部分时间/精力将用于创建已经内置到内核中的几乎完全重复的管道。其次,如果你决定自己建立这一切,我会认真考虑遵循类似的模型。你不需要对它进行奴隶制,但我仍然主要依据一个线程写入数据的数据结构和另一个线程从中读取数据的方式来考虑。通过强烈的偏好,所有必要的线程锁定都将被构建到数据结构中,因此线程中的大部分代码都非常简单,可以读取,处理和写入数据。与使用普通Unix管道的主要区别在于,在这种情况下,您可以使用更方便的格式维护数据,而不是使用文本进行所有的读写操作。
因此,我认为你正在寻找的基本上是一个线程安全的队列。因此,几乎所有涉及到的其他事情都变得琐碎(至少它的线程部分 - 所涉及的处理可能不是,但至少使用多线程构建它并不会增加复杂性)。
很难说C/C++线程有多少经验。我讨厌指向一个链接,但你有没有读到pthreads
?
https://computing.llnl.gov/tutorials/pthreads/
并与代码和简单mutex'es较短的例子(锁定你需要同步的数据对象):
http://students.cs.byu.edu/~cs460ta/cs460/labs/pthreads.html
我建议Boost.Thread用于这一目的。这是一个非常好的互斥体和信号框架,它是多平台的,它是和。 Here你可以找到关于这个很好的教程。
如何同步这些线程是另一个问题,需要更多关于您的问题的信息。
编辑最简单的解决办法是将两个互斥 - 一个在A
和第二上Buffer
。在这种特殊情况下,您不必担心死锁。刚:
MainThread
输入mutex_A
; Thread1
等待互斥体被释放。MainThread
; Thread1
输入mutex_A
和mutex_Buffer
,从A
开始读取,并将其写入Buffer
。Thread1
释放这两个互斥体。 ThreadMain
可以输入mutex_A
并写入数据,并且Thread2
可以从Buffer
安全地读取数据mutex_Buffer
。这显然是最简单的解决方案,也许可以改进,但没有更多关于这个问题的知识,这是我能想到的最好的。
我不认为它回答了这个问题。对于OP“同步这些线程是另一个问题”不是另一个问题,而是问题。 – Arunmu
哪种语言? –
如果语言很重要,我使用C/C++ – pepero
当然它很重要,高级语言(java,C#等)使用本地构造简化了整个过程。我建议重新标记你的问题,以包含一个C++标记。 –