[英]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
。 在這種特殊情況下,您不必擔心死鎖。 只是:
MainThread
輸入mutex_A
; Thread1
等待釋放互斥鎖。 MainThread
保留互斥; Thread1
進入mutex_A
和mutex_Buffer
,開始閱讀A
並將其寫入Buffer
。 Thread1
釋放兩個互斥鎖。 ThreadMain
可以輸入mutex_A
並寫入數據,而Thread2
可以輸入mutex_Buffer
從Buffer
安全讀取數據。 這顯然是最簡單的解決方案,可能會有所改進,但如果沒有更多關於問題的知識,這是我能想到的最好的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.