0

我有多個線程,ThreadA和ThreadsB-Z。使用關鍵部分的線程之間的同步

ThreadA始終處於關鍵部分,將數據從隊列中彈出並將其發送到套接字上。

當從ThreadB到ThreadZ的任何線程都想要進入臨界區時,它只希望ThreadA離開臨界區。然後進入關鍵部分,將一些數據推入隊列並留下關鍵部分。

我這裏有兩個問題:

  1. 將如何ThreadB-Z(凡要進入臨界區) 告訴ThreadA中,當它想 訪問臨界區離開臨界區。
  2. 我SetEvent的或PostThreadMessage的想法想告訴 ThreadA中留下的關鍵部分,但我無法處理 任何事件或主題留言,因爲ThreadA中使用,同時不斷彈出 數據從隊列中(1)並沒有消息循環或 WaitForSingleObject的()式的東西來處理事件或主題的消息 :(

我就像被困在這種情況下,任何幫助/建議是值得歡迎的。在此先感謝。

回答

0

這裏真正的問題是「ThreadA是alwa ys在關鍵部分「。 線程A不應無限期鎖定臨界區。

在C#中,你的代碼的ThreadA看起來是這樣的:

    Message message; 
    
    // Only lock critical section for the time it takes to modify the queue 
    lock(_messageQueueLock){ 
        message = _messageQueue.Dequeue(); 
    } 
    
    // do something with the message 
    

    在我看來,拇指以下一般規則應該使用的關鍵部分時,可以觀察到

  • 儘可能快地輸入並退出臨界區(即最小化臨界區中的代碼量)。
  • 使用關鍵部分來保護資源/資產(例如共享內存,隊列,列表等)
  • 避免使用關鍵部分來保護函數/方法調用。如果您正在從關鍵部分進行函數/方法調用,那麼您正在增加創建死鎖的可能性。
  • 避免嘗試鎖定關鍵部分內的關鍵部分。如果不這樣做,可能會導致應用程序中出現潛在的死鎖。
  • 避免在臨界區域嘗試訪問外部資源(例如,執行數據庫SQL查詢)。
  • 如果這是有道理的,我一般喜歡用下面的命名約定的關鍵部分:如果被保護的資產被稱爲messageQueue ...然後我會說出關鍵部分messageQueueLock

大報價來自微軟:「當你使用任何形式的多線程時,你可能會面臨非常嚴重和複雜的錯誤」[來源:MSDN]

相關問題