【问题标题】:Difference "conditionally safe" and "thread safe"“条件安全”和“线程安全”的区别
【发布时间】:2013-01-31 20:20:03
【问题描述】:

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

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

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

有人能解释一下区别吗?谢谢。

【问题讨论】:

  • 我认为“条件安全”只是意味着,因为线程正在访问具有不同数据的不同对象,所以不可能出现线程问题。

标签: language-agnostic thread-safety


【解决方案1】:

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

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

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

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

【讨论】:

  • 在你的线程安全定义中,第一句话,你的意思是“......来自多个线程的单个实例”吗?
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多