簡體   English   中英

System.Threading.Timer回調中的關鍵部分

[英]Critical section in System.Threading.Timer callback

在我的應用程序中,我有許多System.Threading.Timer實例。 有一種可能性,它們中的兩個會相互重疊。 問題是回調方法中有一個關鍵部分。 提供適當的同步或框架提供解決方案是我的關注嗎?

對問題有一些疑問,所以我會說得更清楚:我現在在回調中沒有同步。

提供適當的同步是我的關注嗎?

如果它是關鍵的並且它應該具有相互獨立的訪問權限,那么您需要自己處理它。

框架是否提供了解決方案

Framework確實提供了多種工具來進行鎖定和監控。 這取決於您的要求您需要什么。 您需要查看此處以查看框架提供的內容。

lock關鍵字確保一個線程不進入代碼的關鍵部分,而另一個線程處於臨界區。 如果另一個線程試圖輸入鎖定的代碼,它將等待,阻止,直到該對象被釋放。

您還可以選擇使用互斥鎖

當兩個或多個線程需要同時訪問共享資源時,系統需要一個同步機制來確保一次只有一個線程使用該資源。 Mutex是一個同步原語,它只允許對一個線程的共享資源進行獨占訪問。 如果某個線程獲取了一個互斥鎖,那么想要獲取該互斥鎖的第二個線程將被掛起,直到第一個線程釋放互斥鎖為止。

你絕對不得不“關注自己”。 如果您選擇不這樣做,那么您將為您的應用程序引入競爭條件,從而引入不必要的行為。

.NET提供了許多解決方案,每個解決方案都有優缺點。 簡要列表可包括:

  • - 我會說簡單的方法。 您將lock將在callback方法上更改的共享內存。 這樣,一次只能有一個線程改變對象。 如果你有多個線程總是在等待釋放鎖定,那么這就失敗了。 鎖的開銷可能會比只使用單個線程更慢。

  • 讀/寫鎖 - 類似於lock ,但現在不是執行通用鎖,而是可以讓多個線程從共享內存中讀取,並且只在需要write lock時才鎖定所有內容。 這可以允許多個線程同時安全地訪問內存。

  • TPL(任務並行庫) - 特定於.NET。 這很可能是您最復雜的解決方案,可能需要更改數據結構。 但我想把它放在這里因為我認為它提供了一個非常強大的解決方案。 使用TPL進行簡單的解釋是,一次只有一個線程在共享內存上運行,但是這樣做時不會阻塞其他線程...所以這樣可以避免讓多個線程弄亂你的對象並導致競爭條件,但你也不會占用幾個線程。 一個很好的起點可能是查看數據流文檔,看看哪種數據結構最符合您的需求。

還有幾個選項,所以不要把它作為一個完整的列表...我會推動大多數情況下的TPL ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM