我有一個C#類與靜態成員,這是從多個線程讀取並寫入一個線程。C#線程安全靜態成員
據我所知,Uint64讀寫不是所有系統上的原子操作,所以我必須手動保證線程安全。
我對如何做到這一點有一些想法。
做它和原子包裝類,就像在c + +中的std :: atomic。在C#中有類似的東西嗎?
在靜態字段中使用volatile修飾符。然而這是不允許的。爲什麼?
我終於做到以下幾點:
private static object tick_time_lock; private static UInt64 _currentTickTime; public static UInt64 CurrentTickTime { get { return _currentTickTime; } set { lock (tick_time_lock) { _currentTickTime = value; } } }
這是使這個領域的線程安全的正確方法?
是的,但是請記住,當您有很多線程設置時,它會放慢速度。也會有競賽狀況。例如,如果將值更新爲... 1,則下一個線程可能會將其更新爲2,但之後第4個可能會將其更新爲... 4,並且第3個可能由於某種競爭條件而晚點進來並覆蓋最後更新的價值。順便說一句,你需要新增tick_time_lock對象。 –
您可能正在尋找['Interlocked'](http://msdn.microsoft.com/zh-cn/library/vstudio/system.threading.interlocked(v = vs.110).aspx)實用程序類。 – millimoose