【问题标题】:Is there a standard thread safe nomenclature?有标准的线程安全命名法吗?
【发布时间】:2010-08-19 14:51:39
【问题描述】:

是否有一个标准术语来区分在多线程环境中可以安全使用的对象(我的对象没有不受保护的静态成员)和在 MT 环境中可以安全使用的对象(可能是因为我在所有公共方法周围加锁)?

让我再补充一点:我有一个 C++ 库,它在多线程环境中使用总体上是安全的,但不是线程安全的。该库包含一个继承自 std::exception 的异常类。 what() 方法返回一个 char*。由于我坚持使用父级中定义的签名,因此我必须将内部内存返回给类,从而使该特定方法比库的其余部分更加不安全。我正在寻找一些在记录此方法时使用的标准术语。

【问题讨论】:

  • 你的意思是,除了“线程安全”?
  • 是的,因为我想区分 MT 环境中的安全和同时使用的安全。
  • 并发使用对象和多线程使用对象有什么区别?
  • 对于包含不受锁保护的静态成员的对象,从不同线程访问对象的不同实例是不安全的。对于在 MT 环境中安全的对象,例如 STL 容器,只要您不同时访问对象的同一个实例,就可以了。
  • 好吧,这两种类型都不是线程安全的,但前者的安全性甚至不如平常,因为它的实例依赖于非安全的静态变量。

标签: multithreading


【解决方案1】:

五年后,我注意到当前关于线程安全的 Wikipeida 文章列出了三个级别的线程安全:

线程安全:当多个线程同时访问时,保证实现不存在竞争条件。

条件安全:不同的线程可以同时访问不同的对象,并且对共享数据的访问不受竞争条件的影响。

不是线程安全的:代码不应该被不同的线程同时访问。

我正在寻找的答案是“有条件安全”类别。

【讨论】:

    【解决方案2】:

    可以在多线程环境中使用的静态方法称为“线程安全”。

    可由多个线程同时使用的实例对象通常称为“不可变”,因为这是确保线程安全的最常见机制。

    如果您在广义上定义“线程安全”,不仅包括避免数据损坏,还包括不可能发生死锁,那么可变实例很少能成为线程安全的,因为线程安全最终取决于对象被使用。

    如果您将“线程安全”狭义地定义为对象始终处于一致状态,那么我不知道此类事物的任何特殊术语。

    通常最好将“线程安全”定义为整个系统的属性而不是类。

    【讨论】:

    • 这是否意味着您将 STL 容器定义为“不可变”但不是线程安全的?
    • 不变性确实导致线程安全,但线程安全性可以来自除不变性之外的其他机制。因此,我觉得这令人困惑和误导。
    • 另外,让可变对象在没有死锁的情况下保持线程安全并不难。
    • @John Gordon - STL 容器不是不可变的,我想说它们根本不是线程安全的。
    • @Steven Sudit - 我的观点是,专注于保护对象的内部而不是如何使用对象并不是创建多线程程序的好方法。它往往导致表面上的安全,而不是实际的事实。例如,“线程安全”的容器对象不能有 Count 属性,因为这样的属性完全没用。
    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 2013-11-27
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多