2013-02-15 22 views
2

我偶然发现维基百科上的线程安全文章;它区别于安全的几个层次,尤其是:差异“条件安全”和“线程安全”

线程安全:实施保证当多个线程同时访问是自由的竞争条件。
条件安全:不同的线程可以同时访问不同的对象,并且访问共享数据时不受竞争条件的限制。

但对我而言,两个定义看起来像说不同的方式来说同样的事情。两者都保证共享数据没有竞争条件。

有人可以解释这种差异吗?谢谢。

+0

我认为“条件安全”仅仅意味着,因为线程正在访问具有单独数据的不同对象,所以不存在线程问题的可能性。 – 2013-02-15 19:21:16

回答

3

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

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

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

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

+0

在你的线程安全定义中,第一句,你的意思是“...来自多个_threads_的单个实例”吗? – 2013-02-19 04:41:22

+0

哎呀,当然。谢谢。 – 2013-02-19 08:41:56