4

我偶然发现了 Wikipedia 上的线程安全文章;它区分了几个安全级别,尤其是:

线程安全:当多个线程同时访问时,保证实现没有竞争条件。
条件安全:不同的线程可以同时访问不同的对象,并且对共享数据的访问不受竞争条件的影响。

但对我来说,这两个定义看起来像是用不同的方式来表达同一件事。两者都保证共享数据没有竞争条件。

有人可以解释其中的区别吗?谢谢。

4

1 回答 1

3

您应该明白,在这两种情况下,共享数据不是一回事。

线程安全谈论从多个线程访问单个实例。因此,如果通过公共方法访问,共享数据可能是该类的任何成员。它不是在实例之间共享(因为只有一个),而是在线程之间共享。

条件安全谈论访问不同的实例,每个实例都来自自己的线程。数据必须在实例之间共享,因此它只能是聚合成员(可能由依赖注入提供)、静态成员或(外部)单例。

但是,如果您阅读了上面提到的 Wikipedia 文章中的所有引用(Qt 是错误的),您就会明白 Wikipedia 甚至可能歪曲了 IBM 的命名。IBM的条件意味着只有类/API中的一些方法是线程安全的,或者线程安全取决于API无法影响的底层服务(给出一个很好的例子)。线程安全与可重入的 Qt 命名约定似乎更合适,因为它不区分线程共享数据和实例共享数据。

于 2013-02-18T16:07:27.930 回答