对于具有组合的类,std :: atomic lock是免费的

时间:2016-09-05 18:27:49

标签: c++ multithreading c++11

我有以下单元测试,它似乎暗示std :: atomic对于带有std :: string的结构或具有继承的类是免费的,但不是具有组合的类。

我原本期望std :: string可能因为堆分配而需要锁定等等。我也期待组合和继承在内存布局等方面足够接近,它们的锁定性将是相同的。

为什么我的期望不成立的任何建议?我在ubuntu 14.04和gcc 4.9。

TEST(Test, PODWithString) {
  struct POD {int a; std::string b;};
  std::atomic<POD> pod({1,"2"});
  EXPECT_TRUE(pod.is_lock_free());
}

TEST(Test, INHERITANCE) {
  struct B {B(int x): x(x) {} int x; };                                                                                        
  struct D : public B {D(int x, int a): B(x),a(a) {} int a; };                                                                 
  std::atomic<D> d(D(1,2));
  EXPECT_TRUE(d.is_lock_free());                                                                                               
}

TEST(Test, PODNested) {
  struct POD {int x; int y;};
  struct PODNested {int a; POD b;};
  std::atomic<PODNested> pod_nested({1, {2,3}});
  EXPECT_FALSE(pod_nested.is_lock_free());
}

0 个答案:

没有答案