【发布时间】:2017-05-16 10:13:33
【问题描述】:
我想从多个线程调用以下代码。
// x is a global/member and initialized to 0
if (Interlocked.Increment(ref x) == 2)
{
// do something only once
}
这当然不是线程安全的:如果在运行时第一个线程在 x 递增之后但在评估之前停止,然后第二个线程递增 x 所以它现在是 2,然后是 @987654324 @ 声明是true。然后我们回到第一个线程,它在if 语句中也成立。
这可以通过用lock 语句包围代码来解决。
有没有办法在不使用lock 语句的情况下使其线程安全?
【问题讨论】:
-
你描述的场景不会发生,因为
Interlocked.Increment()方法的返回值不能被其他线程改变。 -
您的代码可能不安全,如果它稍后再次访问
x并假设它与增量的结果相同,但您没有在此处显示演示代码这个问题。
标签: c# multithreading thread-safety locking