2010-10-20 55 views
2

我有一個應用程序使用Mutex進行跨代程序代碼塊的同步。這種機制對於應用程序當前的需求非常有用。在最糟糕的情況下,我注意到大約有6個線程可以在互斥體上備份。大約需要2-3秒才能執行同步代碼塊。.Net Mutex問題

我剛剛收到一個新要求,即要求爲互斥體創建一個優先功能,以便有時互斥體的某些請求可以被視爲比其他要求更重要。當這些更高優先級的線程之一進入期望的功能時,Mutex會將獲取授予更高優先級的請求,而不是更低的優先級請求。

那麼有沒有辦法控制Windows維護的阻塞的互斥隊列?我應該考慮使用不同的線程模型嗎?

謝謝, 馬特

+0

互斥體沒有優先級 – Andrey 2010-10-20 14:27:36

回答

3

只使用互斥量這將是一個難以解決的問題,我相信有人在那裏考慮線程優先級等,但我可能不會考慮這條路線。

一種選擇是維護一個共享內存結構並實現一個簡單的優先級隊列。共享內存可以使用MemoryMappedFile,然後當一個進程想要執行這段代碼時,它會在優先級隊列中放置一個優先級的令牌,然後當它喚醒時,每個線程檢查優先級隊列以檢查隊列中的第一個令牌如果令牌屬於進程,它可以將令牌出隊並執行代碼。

+0

由於我沒有投票的聲望,所以我只能說感謝克里斯。我認爲這是最好的前進道路。 – KithKann 2010-10-20 16:19:37

0

互斥鎖心不是那個偉大的一些原因,而據我所知,有沒有辦法改變推動一個線程在另一個,而他們正在運行,也沒有一個很好的辦法滿足您的要求。 我剛剛讀過Jeffrey Richters的「clr via c#3」,並且裏面有很好的線程同步結構,並且通常有很多很好的線程建議。

我希望我能夠記住它足以回答你的問題,但我懷疑我會盡可能地把它解決。看看他的網站:http://www.wintellect.com/或搜索一些他的並行事務文章。 他們肯定會幫助。

0

給每個線程一個AutoResetEvent。然後,不是等待互斥體,而是每個線程將它的ARE添加到排序列表中。如果列表中只有一個ARE,請觸發該事件,否則等待其ARE發射。當線程完成處理時,它從列表中刪除它並觸發下一個。一定要同步列表。