Multithreading 处理并发读取?

Multithreading 处理并发读取?,multithreading,concurrency,Multithreading,Concurrency,我是并发编程的新手,我有一个特定的情况,我想了解一下。如果我有一个变量,我将从多个线程访问它,但只是为了读取该值(它不是常量的唯一原因是因为我需要在运行时设置它),我是否需要一个互斥锁?或者,您是否只需要担心写入到共享资源时的竞争条件?如果在启动线程之前设置该值,则不需要互斥。 如果在启动线程后设置该值,则需要一个互斥锁,以确保所有线程读取相同的值。从逻辑上讲,如果只读取共享数据,则可能不需要使用互斥锁。但是,对于大型程序,您必须使用它以避免混淆。这取决于您所谈论的语言和机器体系结构以及“读取变

我是并发编程的新手,我有一个特定的情况,我想了解一下。如果我有一个变量,我将从多个线程访问它,但只是为了读取该值(它不是常量的唯一原因是因为我需要在运行时设置它),我是否需要一个互斥锁?或者,您是否只需要担心写入到共享资源时的竞争条件?

如果在启动线程之前设置该值,则不需要互斥。
如果在启动线程后设置该值,则需要一个互斥锁,以确保所有线程读取相同的值。

从逻辑上讲,如果只读取共享数据,则可能不需要使用互斥锁。但是,对于大型程序,您必须使用它以避免混淆。

这取决于您所谈论的语言和机器体系结构以及“读取变量”在该语言中的含义。当“读取变量”转换为仅在机器级别从内存读取时,并发读取本身通常是安全的。当然,您需要确保程序中没有任何其他内容会转换为写入相同的内存区域


许多主流语言(Java、C#、C、C++)对程序如何转换为内存访问只提供很弱的保证。同时,您得到的保证往往采用非常复杂的规则的形式,例如,关于何时可以对语句序列重新排序。为了避免引入真正难以发现的bug,通常最好以尽可能不微妙和具体的形式要求所需的同步属性,即使用互斥体。

我想说的是,您应该始终担心竞争条件,但这不是很有帮助。相反,我想知道:你是在启动线程之前还是之后“在运行时设置”呢?Eric Lippert的相关及时博客文章:当然有细微差别,但TLDR:使用锁;未来的维护者会更感谢你,因为你没有来自种族的神秘bug,而不是节省了无数的时间。谢谢,这正是我想知道的。然而,基于其他一些响应,我认为我仍然会使用互斥来避免任何混乱。如果值只在多个线程启动后读取,则不需要任何形式的同步。程序的“大”与否没有任何区别。它确实有区别。:)