在Windows中(假设正在使用四核处理器),目前有4个高优先级线程并行运行。
我必须执行一个简单的应用程序,它只计算每X / 2 ms。在哪里' X'是ms用于线程上下文切换的最短时间。
在这种情况下,正在更新的计数将无法准确地告知已经过了多少X / 2毫秒。
是吗?
答案 0 :(得分:1)
这里的问题是增加变量不是线程安全,你必须以某种方式锁定它,否则在不同的cpus上运行的线程将不断与最新的计数器值过时。< / p>
执行此操作的最佳方法是使用某种锁定机制,例如lock
。然而,这将有一些开销,并不会给你真正的最大性能。
如果您想尽可能接近,请考虑使用lock
更好的锁定机制,例如:
Interlocked.Increment(ref myNum);
Interlocked.Increment Method (Int32)
增加指定变量并将结果存储为原子 操作
Increment
基本上变成了“总线锁定”声明。当调用 CPU 执行其操作时,此语句将锁定总线以防止另一个 CPU 访问总线
然而,最好查看所有Interlocked方法,以查看可用的各种原子操作并找到适合您需求的方法。当您想要执行更复杂的事情(如多个相互关联的增量/减量)或序列化对比整数更复杂的资源的访问时,请使用lock()
。