Jul*_*n-L 6 language-agnostic thread-safety
我偶然发现了维基百科上的线程安全文章;它区分了几个安全级别,特别是:
线程安全:当多个线程同时访问时,保证实现不存在竞争条件。
有条件安全:不同的线程可以同时访问不同的对象,并且对共享数据的访问受到竞争条件的保护。
但对我来说,这两个定义看起来像是同一件事的不同表达方式。两者都保证共享数据不存在竞争条件。
有人可以解释其中的区别吗?谢谢。
您应该明白,在这两种情况下共享数据不是同一件事。
线程安全谈论从多个线程访问单个实例。因此,如果通过公共方法访问,共享数据可以是该类的任何成员。它不在实例之间共享(因为只有一个),而仅在线程之间共享。
有条件安全谈论访问不同的实例,每个实例都从自己的线程访问。数据必须在实例之间共享,因此它只能是聚合成员(可能由依赖注入提供)、静态成员或(外部)单例。
但是,如果您阅读了上述 Wikipedia 文章中的所有引用(Qt 的文章是错误的),您就会明白 Wikipedia 甚至可能歪曲了 IBM 的命名。IBM 的条件意味着只有类/API 中的某些方法是线程安全的,或者线程安全取决于 API 无法影响的底层服务(举一个很好的例子)。线程安全与可重入的 Qt 命名约定似乎更合适,因为它不区分线程共享数据和实例共享数据。