在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)
在C++中,我教会使用volatile关键字变量(myVar),即使在关键部分也可以使用不同的线程
谁教你,这不是教你整个故事.C++中的Volatile不保证读取或写入具有获取或释放语义!所有易失性保证是编译器不会生成elides读取或无序读写的代码.单独使用Volatile不足以确保多线程中的正确语义,除非您的编译器对"volatile"对其意味着什么做出了额外的声明.
volatile修饰符通常用于多个线程访问的字段,而不使用lock语句来序列化访问."这句话是否意味着如果我处于锁定状态,那么不需要使用volatile关键字?
正确.在C#,易失性确实引入获取和通过将合适的半围栏释放语义.由于锁引入了完整的栅栏,因此在读取锁中的字段时不需要volatile.
可能我必须锁定exect这个变量(myVar)?
所有这些代码都是如此完全破碎和错误,以至于无法回答这个问题.++对双打很危险,在C#中使双精灵易失甚至不合法,你无法锁定值类型.
| 归档时间: |
|
| 查看次数: |
680 次 |
| 最近记录: |