我在做多線程的時候非常瞭解,儘管頭疼得厲害,但我仍然覺得它非常迷人。我正在使用qt並且一直在檢查教程,發現一個完全適用於我的情況,即將數據流式傳輸到循環緩衝區,一個線程寫入它,一個線程讀取它。這是教程here。首先讓我問你是否在等待條件下選擇了正確的方法。爲什麼我在使用qt等待條件時不必在鎖定/解鎖語句中進行換行?
我選擇不使用信號量,因爲緩衝區的大小可能會隨時從主線程中改變,導致重新分配和重新調整讀/寫索引,並且調整信號量不會顯得那麼容易。我不希望在循環中放置一個if是否要執行循環體,因爲它必須一遍又一遍地執行,直到它可以在緩衝區中放入更多數據爲止,所以等待條件是我的自然解決方案。
其次,我對他們的例子中的等待條件是什麼感到困惑。看起來他們鎖定了互斥鎖,檢查等待條件並阻止,當條件滿足時繼續,然後在那裏解鎖互斥鎖。這並不意味着在這一點上對緩衝區的訪問是完全不受保護的嗎?
第三,當我的主線程想停止時,如何結束這些線程,我有點不知所措。我不能使用等待條件,因爲我希望它們只要主線程希望就運行,並且我不認爲我可以通過線程發出信號告訴它退出。是唯一的方法來通知線程停止執行,如果某個地方經常檢查每個循環中位於主線程中的布爾,然後等待線程在析構函數中退出,那麼唯一方法是通知線程停止執行。問題在於,在等待條件下,我必須首先設置bool退出,然後喚醒這兩個線程。我真的很困惑在這裏做什麼,任何建議表示讚賞。
關於QMutexLocker的問題,文檔告訴我它所做的只是鎖定構造函數中給出的互斥鎖,然後在其銷燬時解鎖。在循環過程中,互斥鎖永遠不會被銷燬,所以何時鎖定和解鎖互斥鎖以訪問shouldStop,numUsedBytes,bufferSize和buffer?基本上他們爲什麼必須將等待語句包裝在鎖定/解鎖塊中呢? – FatalCatharsis
儲物櫃在超出範圍時被破壞,所以在我的代碼退出並離開花括號後,然後儲物櫃被破壞,互斥鎖解鎖 –
好吧,我明白了,我的意思是關於發生在while循環。在他們的例子中,他們將mutex.lock()和mutex.unlock()中的if和wait條件包裝起來,但在你的例子中,你所做的只是等待。他們這樣做的目的是什麼? – FatalCatharsis