【发布时间】:2013-12-10 21:42:19
【问题描述】:
我有一个带有静态成员的 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实用程序类。
标签: c# .net multithreading atomic