c++ - 即使每个线程都对自己的数据进行操作,是否有任何 cpp 函数或对象(不包括从 c 继承的)不是线程安全的?

标签 c++ reentrancy

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

最佳答案

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

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

你提到的情况显然是不允许的:“

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

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

关于c++ - 即使每个线程都对自己的数据进行操作,是否有任何 cpp 函数或对象(不包括从 c 继承的)不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7471540/

相关文章:

c++ - C++ POD 类型不能有任何构造函数吗?

c++ - 将 BSTR 存储在 std::vector 中?

java - 同步方法重写 - 线程获取哪个对象的锁?

google-apps-script - Google Apps 脚本是否可重入?

c - 维基百科关于重入的错误吗?

c++ - IPC共享内存是否从堆中获取内存?

c++ - 在 C++ 中使用模板是什么意思

c++ - 静态函数与 const 函数

sql - 是否可以在 dotnet 中引入多线程而不显式创建新线程?

objective-c - 具有运行到完成语义的 KVO - 这可能吗?