对类成员的线程安全访问

时间:2015-01-15 11:17:11

标签: c++ multithreading thread-safety c++03

是否同时从两个不同的POSIX线程访问同一对象的两个不同类成员,并认为它们在C ++ 03中是线程安全的?

1 个答案:

答案 0 :(得分:0)

不。(有一点“是”的声音)

从C ++ 03标准的角度来看,没有线程这样的东西存在,所以没有任何条件,标准会将涉及并发的任何东西视为“安全”。

虽然这通常没有问题(有一点点关心和适当的同步原语超出了C ++的范围,但它仍然会“工作”),有一些事情需要注意,其中包括:

  • errno(和其他结构)可能不是线程本地的。 -pthread命令行选项主要解决此问题。
  • 类成员可以通过引用,指针或联合互相别名,因此,突变不同的成员可能确实会同时突变相同的成员
  • 在没有内存模型的情况下,允许编译器(并且将会)重新排序加载和存储,这意味着例如通过首先编写一段数据,然后设置“数据准备好”的“明显”通信方式“国旗可能无法按预期运作。
  • 在Windows下,当程序加载DLL时,在线程存在时会出现一些不那么明显的静态动态CRT问题。确保所有组件都“相同的东西”(无论它是什么)。
  • 此外,一些旧版本的CRT可能会为每个线程泄漏几百字节的内存(通常不是问题)。
  • 不可变对象本身就是线程安全的,几个线程的只读访问也是如此。