我有一个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