【发布时间】:2011-10-18 16:47:59
【问题描述】:
我认为我理解一些关于线程安全的问题,但如果您能这么好,我想澄清一下。我编程使用的特定语言是 C++、C# 和 Java。希望在描述特定语言关键字/功能时牢记这些。
1) 1 个作者,n 个读者的案例。在 n 个线程读取变量(例如在轮询循环中)和 1 个写入器更新此变量的情况下,是否需要显式锁定?
考虑:
// thread 1.
volatile bool bWorking = true;
void stopWork() { bWorking = false; }
// thread n
while (bWorking) {...}
在这里,仅仅有一个内存屏障就足够了,并用 volatile 完成这个?因为据我了解,在我上面提到的语言中,对原语的简单读取和写入不会被交错,因此不需要显式锁定,但是如果没有一些显式锁定或易失性,就无法保证内存一致性。我的假设在这里正确吗?
2) 假设我上面的假设是正确的,那么它只对 simple 读取和写入是正确的。即 bWorking = x... 和 x = bWorking;是唯一安全的操作吗? IE 复杂的赋值,如一元运算符(++、--)在这里是不安全的,+=、*= 等...?
3) 我假设如果案例 1 是正确的,那么当只涉及分配和阅读时,将该语句扩展为对 n 个作者和 n 个读者也安全是不安全的?
【问题讨论】:
-
在 C++ 中
volatile的意思是“编译器,我知道你很聪明,但请不要优化访问这个东西,好吗?”。 线程无关。在 C# 和 Java 中,这意味着对字段的更改在其他线程中立即可见。 -
在 C++ 中,
volatile与多线程没有任何关系。忘记你认为是的。 C++03(当前的 C++)对多线程的支持为零;没有关键字或标准库函数可以让您到达那里。 C++0x 引入了锁和原子变量,它们将。此外,三种语言太多了,尤其是对于如此截然不同的语言。你应该把范围缩小到你目前正在从事的工作。 -
大概您比较了锁的性能并发现了显着差异?否则,您甚至不会考虑正确性难以确定的方法。
标签: c# java c++ multithreading