3
如果

我有如何三個因線程同步

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

哪種語言? –

+0

如果語言很重要,我使用C/C++ – pepero

+0

當然它很重要,高級語言(java,C#等)使用本地構造簡化了整個過程。我建議重新標記你的問題,以包含一個C++標記。 –

回答

4

首先,我會考慮將此作爲三個獨立進程構建的可能性,並使用管道來連接它們。管道(本質上)是一個小緩衝區,內核自動處理鎖定。如果你最終爲此使用線程,大部分時間/精力將用於創建已經內置到內核中的幾乎完全重複的管道。其次,如果你決定自己建立這一切,我會認真考慮遵循類似的模型。你不需要對它進行奴隸制,但我仍然主要依據一個線程寫入數據的數據結構和另一個線程從中讀取數據的方式來考慮。通過強烈的偏好,所有必要的線程鎖定都將被構建到數據結構中,因此線程中的大部分代碼都非常簡單,可以讀取,處理和寫入數據。與使用普通Unix管道的主要區別在於,在這種情況下,您可以使用更方便的格式維護數據,而不是使用文本進行所有的讀寫操作。

因此,我認爲你正在尋找的基本上是一個線程安全的隊列。因此,幾乎所有涉及到的其他事情都變得瑣碎(至少它的線程部分 - 所涉及的處理可能不是,但至少使用多線程構建它並不會增加複雜性)。

1

我建議Boost.Thread用於這一目的。這是一個非常好的互斥體和信號框架,它是多平臺的,它是Here你可以找到關於這個很好的教程。

如何同步這些線程是另一個問題,需要更多關於您的問題的信息。


編輯最簡單的解決辦法是將兩個互斥 - 一個在A和第二上Buffer。在這種特殊情況下,您不必擔心死鎖。剛:

  1. MainThread輸入mutex_A; Thread1等待互斥體被釋放。
  2. 將互斥量從MainThread; Thread1輸入mutex_Amutex_Buffer,從A開始讀取,並將其寫入Buffer
  3. Thread1釋放這兩個互斥體。 ThreadMain可以輸入mutex_A並寫入數據,並且Thread2可以從Buffer安全地讀取數據mutex_Buffer

這顯然是最簡單的解決方案,也許可以改進,但沒有更多關於這個問題的知識,這是我能想到的最好的。

+0

我不認爲它回答了這個問題。對於OP「同步這些線程是另一個問題」不是另一個問題,而是問題。 – Arunmu