差异“有条件安全”和“线程安全”

时间:2013-02-15 19:19:36

标签: language-agnostic thread-safety

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

  

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

但对我来说,两种定义看起来都是不同的说法。两者都保证共享数据没有竞争条件。

有人可以解释一下这个区别吗?感谢。

1 个答案:

答案 0 :(得分:3)

您应该了解共享数据在这两种情况下并不相同。

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

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

但是,如果您阅读了上述维基百科文章(the Qt one is wrong)中的所有引文,您就会明白维基百科可能甚至歪曲了IBM的命名。 IBM的条件意味着只有类/ API中的某些方法是线程安全的,或者线程安全依赖于API无法影响的底层服务(给出一个很好的例子) )。 threadsafe与reentrant 的Qt命名约定似乎更合适,因为它不区分线程共享数据和实例共享数据。