1

抱歉,标题很长,但我认为它很好地解释了我感兴趣的内容。例如,C 函数 strtok 在最坏的情况下不是线程安全的 :),它使用全局状态。因此,即使在不同的数据上调用它也不是线程安全的。所以我的问题是“C++减C”中的函数是否有同样的问题。同样,我对“如果您从 10 个线程写入同一个文件,这是未定义的行为”之类的东西不感兴趣。我感兴趣的是“如果您从 2 个差异线程(每个线程写入自己的文件)写入 2 个差异文件,那么这不是线程安全的。”

4

3 回答 3

3

只有 C++11 真正涵盖了线程安全;C++03 没有指定多线程行为。

在 C++11 中,相关位是 1.10/8“某些库调用与另一个线程执行的其他库调用同步。例如,原子存储释放与从存储中获取其值的加载获取同步(29.3 )。” 尤其是§17.6.5.9 避免数据竞争。

你提到的案例显然是不允许的:”

  1. 本节规定了实现应满足的要求,以防止数据竞争 (1.10)。除非另有说明,否则每个标准库函数都应满足每个要求。实施可能会在下面指定的情况以外的情况下防止数据竞争。
  2. C++ 标准库函数不应直接或间接访问可由当前线程以外的线程访问的对象 (1.10),除非通过函数的参数直接或间接访问对象,包括 this。
  3. C++ 标准库函数不得直接或间接修改可由当前线程以外的线程访问的对象 (1.10),除非通过函数的非常量参数直接或间接访问对象,包括 this。
  4. [注意:这意味着,例如,实现不能在没有同步的情况下将静态对象用于内部目的,因为即使在没有显式在线程之间共享对象的程序中,它也可能导致数据竞争。——尾注]

上面的文字说“除非另有说明”,它包括一些 C 函数,例如 (27.9.2/2) “tmpnam使用参数调用函数NULL可能会引入数据竞争 (17.6.5.9) 与其他tmpnam调用的论点NULL。”

于 2011-09-19T13:58:37.140 回答
2

C++ 标准不保证new(或malloc())是线程安全的。尽管让它们线程安全非常重要。

但是,大多数平台都支持线程安全new

于 2011-09-19T13:30:37.273 回答
1

实际上,C++ 区分了“只读线程安全”和“全线程安全”。例如,所有 std 容器都是“只读”线程安全的,如果任何线程修改了容器,它们都是不安全的。

但是,当您不访问共享数据时,我不记得有任何 C++ 功能是不安全的。

于 2011-09-19T13:29:59.370 回答