2010-06-13 38 views

回答

9

如果你的假设成立,那就没有问题了。

+0

如果他的假设成立,问题不是问题吗? (它可能不会,请参阅guffa的答案:http://stackoverflow.com/questions/3033425/are-simultaneous-reads-of-a-variable-thread-safe/3033439#3033439) – Kris 2010-06-13 18:48:08

+0

即使目前没有写入,前一个权利可能尚未对所有创建竞赛条件的线索都可见。查看我的答案了解更多详情。 – JaredPar 2010-06-13 19:02:07

+1

@Kris,@JaredPar:确实如此,但我正在回答OP所述的问题。 :-) – 2010-06-13 19:17:12

0

鉴于数据库通常可以使用shared read locks,其中任何数量的客户端可能会读取同一个块,我建议不存在直接的固有问题。

0

有三个字符。

编辑: 哎呦。是的,它是线程安全的。不,没有问题。人们通常会问是否线程安全,而不是线程不安全。

3

只要它是一个简单的变量,就没有风险。

如果它是一个属性,阅读它可能会有副作用,所以不能保证是线程安全的。

7

没有这种操作本质上不是线程安全的。

尽管变量当前未被写入,但以前对该变量的写入操作可能对所有线程都不可见。这意味着两个线程可以读取相同的值并获得不同的结果,从而创建竞争条件。

这可以通过内存障碍,正确使用volatile或其他一些机制来防止。我们需要更多地了解您的环境,特别是语言,以给出完整的解释。

稍微重申一下你的问题,虽然会产生更好的答案。假设没有更多写入,并且所有先前的写入对当前线程都是可见的,那么从多个线程读取值是安全的。

+0

虽然挥发性的使用确实取决于语言,但答案很好。在c/C++中,volatile是一个明确的错误的朋友,因为生成的代码非常适合编译器,并且它们没有标准来说明一个volatile变量实际上应该做什么 – zebrabox 2010-06-13 23:11:38

+0

@zebrabox,非常正确。我试图小心答案,因为它非常具有语言+平台特定性。 – JaredPar 2010-06-14 01:09:14