2013-07-03 88 views
1

我有一個發件人線程和40個工作線程。有一個隊列。所有40個線程都寫入隊列,並且發送方線程定期從共享隊列讀取數據,並通過tcp套接字讀取數據(例如,每隔1秒後,發送方線程必須從隊列讀取數據並通過套接字發送數據)。我這裏有一個問題:線程同步和設置線程的優先級

  1. 如果任何一個40個線程的是在關鍵部分和所有其他線程也在等待進入臨界區,並在同一時間1秒計時器了,我想忽略所有其他線程進入關鍵部分的請求以及發送者線程必須優先考慮,並且必須給出關鍵部分。

換句話說,我想發送線程的優先級設置爲1點,即當發件人線程調用EnterCriticalSection的(),那麼,正在等待進入臨界區的所有其他線程必須被忽略,一旦關鍵部分獲得免費,它必須給予發件人線程。 有什麼辦法可以實現這個功能嗎?

回答

2

你不能通過使用優先級來實現它,因爲如果任何工作線程持有一個鎖,那麼優先級不能強制他們釋放它。這裏是我能想到的一個實現。

只要發送者線程在1秒的持續時間內喚醒,它就會向工作進程發送一個信號。在信號處理程序中釋放由工作人員持有的鎖(我猜這裏是一個二進制信號量,因此在信號處理程序中它的值爲0),所以無論工作線程將嘗試訪問它都會被阻塞。在發送端發送的所有數據包,並在重新設置信號燈回1

這到底是一種實現方式,你能想到的認爲自己這樣的,但最終它應該工作。:)

1

你可能只想要一個讀寫器鎖的變種。可能只是一個簡單的Win32臨界區鎖是所需要的。

這是爲什麼。關鍵部分中的操作將數據附加到隊列(或從隊列讀取)是非阻塞操作。換句話說,隊列上的任何操作都不會超過幾分之一毫秒。如果你使用Windows critical section lock(EnterCriticalSection,LeaveCriticalSection),則保證公平性等待進入CS的線程(我相當確定這一點)。

所以,如果所有40個寫線程需要進入CS追加到隊列中,這應該不會超過一兩毫秒爲讀者線程多等待輪到獲取鎖。當然,這是假定寫入線程僅複製存儲隊列,而不是做任何長阻塞I/O操作,而具有獲得鎖。

0

您的問題的一個可能的解決方案在於線程在Linux中實現的方式。嘗試並有一個互斥體。讓你的發件人線程創建一個名爲FIFO(使用mkfifo()調用),而且,當你創建說40個工作者線程,在各自的職責,讓他們用於接收創建一個名爲FIFO。每當你的發件人線程想要與你的工作線程之一進行通信,使用open()調用打開worker_fifo和寫入光盤,關閉它。但是當你有事情,比如用戶客戶端應用程序的事情,當你打開一個FIFO,把一個互斥鎖,做你想做的(讀/寫)和解鎖互斥,當你用它做。

+0

而且,即使信號也適合同步 – 2013-07-03 07:53:56