Multithreading 同时读取变量是否是线程安全的?

Multithreading 同时读取变量是否是线程安全的?,multithreading,Multithreading,假设变量在读取过程中没有被修改的风险,那么由2个或更多线程同时读取变量是否存在任何固有问题 如果您的假设成立,那么就没有问题。鉴于数据库可以普遍使用,任何数量的客户端都可以读取同一个块,我建议不存在直接的固有问题。有三个字符 编辑: 哎呀。是的,它是线程安全的。不,没有问题。人们通常会问某个东西是否线程安全,而不是它是否线程不安全。只要它是一个普通变量,就没有风险 如果它是一个属性,读取它可能会有副作用,因此不能保证线程安全。否此操作本身不是线程安全的 即使当前未写入变量,以前对变量的写入可能尚

假设变量在读取过程中没有被修改的风险,那么由2个或更多线程同时读取变量是否存在任何固有问题

如果您的假设成立,那么就没有问题。

鉴于数据库可以普遍使用,任何数量的客户端都可以读取同一个块,我建议不存在直接的固有问题。

有三个字符

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

只要它是一个普通变量,就没有风险


如果它是一个属性,读取它可能会有副作用,因此不能保证线程安全。

否此操作本身不是线程安全的

即使当前未写入变量,以前对变量的写入可能尚未对所有线程可见。这意味着两个线程可以读取相同的值,并在创建竞争条件时获得不同的结果

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


不过,稍微重复一下你的问题会得到更好的答案。假设没有更多的写操作,并且当前线程可以看到所有以前的写操作,那么从多个线程读取值是安全的

问题不在于弄清他的假设是否成立吗?(可能没有,请参见guffa的回答:)即使当前没有写入,但创建竞态条件的所有线程可能还看不到以前的权限。更多细节请参见我的答案。@Kris,@JaredPar:没错,但我正在回答OP的问题,如上所述。:-)答案很好,不过volatile的使用实际上取决于语言。在c/c++中,volatile肯定是一个错误的朋友,因为生成的代码非常特定于编译器,并且它们没有标准来说明volatile变量实际上应该是什么do@zebrabox,非常正确。我尽量小心回答,因为这是一个非常语言+平台特定的问题。我试图更多地理解一个类似的问题,如果我让一个编写者做增量,一个读者读值,如果我不关心读者是在增量之前还是之后读值,不使用lock和atomics安全吗?据我所知,如果全局变量从未写入(const),那么就没有问题了。假设变量在多线程时总是有被修改的风险可能更安全