gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:58:32 25 4
gpt4 key购买 nike

在 C++ 中,我被教导对变量 (myVar) 使用 volatile 关键字,即使在临界区下,变量 (myVar) 也从不同的线程使用。但是对于 C#,我在 MSDN 中读到了这个奇怪的短语:“volatile 修饰符通常用于在不使用 lock 语句序列化访问的情况下由多个线程访问的字段。”这句话是否意味着如果我处于锁定状态则不需要使用 volatile 关键字?如果是,那么还有一个问题:可能我必须锁定执行此变量 (myVar)?

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

Thread2 做同样的事情。i 和 k 不可变是否安全,或者我必须这样做?:

lock(i)
{
i++;// using variable i.
}
lock(k)
{
k++;// using variable k.
}

最佳答案

In C++ I'm taught to use volatile keyword for variable (myVar) that is used from different threads even under critical section

无论谁教你这个,都没有教你整个故事。 C++ 中的 Volatile 不保证读取或写入具有获取或释放语义!所有 volatile 保证是编译器不会生成省略读取或乱序读取和写入的代码。 单独使用 volatile 不足以确保多线程中的正确语义,除非您的编译器对“volatile”的含义做出一些额外声明。

The volatile modifier is usually used for a field that is accessed by multiple threads without using the lock statement to serialize access." Does this phrase mean that if I'm under lock then do not need to use volatile keyword?

正确。在 C# 中,volatile 确实通过插入适当的半栅栏来引入获取和释放语义。由于锁引入了完整的栅栏,因此在读取锁中的字段时不需要使用 volatile。

may be I must do lock on exect this variable (myVar)?

所有这些代码都是完全错误的,以至于无法回答这个问题。++ 在 double 上很危险,使 double 变易变在 C# 中甚至是不合法的,并且您不能锁定值类型。

关于c# - C# 和 C++ 中的 volatile 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20695220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com