C#和C++中的volatile关键字

use*_*273 3 c# c++ volatile

在C++中,我教会使用volatile关键字变量(myVar),即使在关键部分也可以使用不同的线程.但对于C#,我在MSDN中读到了这个奇怪的短语:"volatile修饰符通常用于多个线程访问的字段,而不使用lock语句来序列化访问." 这句话是否意味着如果我处于锁定状态,那么不需要使用volatile关键字?如果是,那么还有一个问题:可能是我必须锁定exect这个变量(myVar)?

Object a = new Object();
double i,k;
Thread1()
{
    lock(a)
    {
        i++;// using variable i.
        k++;// using variable k.
    }
}
Run Code Online (Sandbox Code Playgroud)

Thread2也是如此.我和k没有波动是否安全,或者我必须这样做?:

lock(i)
{
    i++;// using variable i.
}
lock(k)
{
    k++;// using variable k.
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 6

在C++中,我教会使用volatile关键字变量(myVar),即使在关键部分也可以使用不同的线程

谁教你,这不是教你整个故事.C++中的Volatile不保证读取或写入具有获取或释放语义!所有易失性保证是编译器不会生成elides读取或无序读写的代码.单独使用Volatile不足以确保多线程中的正确语义,除非您的编译器对"volatile"对其意味着什么做出了额外的声明.

volatile修饰符通常用于多个线程访问的字段,而不使用lock语句来序列化访问."这句话是否意味着如果我处于锁定状态,那么不需要使用volatile关键字?

正确.在C#,易失性确实引入获取和通过将合适的半围栏释放语义.由于锁引入了完整的栅栏,因此在读取锁中的字段时不需要volatile.

可能我必须锁定exect这个变量(myVar)?

所有这些代码都是如此完全破碎和错误,以至于无法回答这个问题.++对双打很危险,在C#中使双精灵易失甚至不合法,你无法锁定值类型.