簡體   English   中英

如何同步三個依賴線程

[英]how to synchronize three dependent threads

如果我有

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/

對於代碼和簡單互斥鎖的簡短示例(鎖定對象,您需要同步數據):

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

為此我建議Boost.Thread 這是互斥和信號量相當不錯的框架它是多平台的。 在這里你可以找到關於這個的非常好的教程。

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


編輯最簡單的解決方案是放兩個互斥鎖 - 一個在A ,第二個在Buffer 在這種特殊情況下,您不必擔心死鎖。 只是:

  1. MainThread輸入mutex_A ; Thread1等待釋放互斥鎖。
  2. MainThread保留互斥; Thread1進入mutex_Amutex_Buffer ,開始閱讀A並將其寫入Buffer
  3. Thread1釋放兩個互斥鎖。 ThreadMain可以輸入mutex_A並寫入數據,而Thread2可以輸入mutex_BufferBuffer安全讀取數據。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM