相关疑难解决方法(0)

易失性与联锁对抗锁定

假设一个类有一个public int counter由多个线程访问的字段.这int只是递增或递减.

要增加此字段,应使用哪种方法,为什么?

  • lock(this.locker) this.counter++;,
  • Interlocked.Increment(ref this.counter);,
  • 将访问修饰符更改counterpublic volatile.

现在,我发现volatile,我已经删除了许多lock语句和使用Interlocked.但是有理由不这样做吗?

c# multithreading locking volatile interlocked

647
推荐指数
8
解决办法
13万
查看次数

Interlocked是否保证C#中其他线程的可见性,还是仍然需要使用volatile?

我一直在阅读类似问题的答案,但我仍然有点困惑......亚伯有一个很好的答案,但这是我不确定的部分:

...声明变量volatile会使每次访问都变得不稳定.不可能以任何其他方式强制执行此行为,因此不能用Interlocked替换volatile.在其他库,接口或硬件可以访问您的变量并随时更新它或需要最新版本的情况下,需要这样做.

是否Interlocked保证对所有线程的原子操作的可见性,或者我是否仍然必须volatile在值上使用关键字以保证对更改的可见性?

这是我的例子:

volatile int value = 100000; // <-- do I need the volitile keyword
// ....

public void AnotherThreadMethod()
{
 while(Interlocked.Decrement(ref value)>0)
 {
  // do something
 }
}


public void AThreadMethod()
{
 while(value > 0)
 {
  // do something
 }
}
Run Code Online (Sandbox Code Playgroud)

更新:
我是一个糟糕的运动,我改变了原来的例子,所以这里又是:

public class CountDownLatch
{
    private volatile int m_remain; // <--- do I need the volatile keyword here?
    private EventWaitHandle m_event;

    public CountDownLatch(int count)
    {
        Reset(count);
    }

    public void …
Run Code Online (Sandbox Code Playgroud)

c# multithreading volatile interlocked thread-safety

6
推荐指数
1
解决办法
931
查看次数