依赖于初始化的顺序

7 c++ c++14

根据C++ 14标准,非静态成员变量按照它们在类中声明的顺序进行初始化.下面的减少代码依赖于此规则来控制线程函数.

class foo
{
     foo(): 
          keep_going{true},
          my_thread(&foo::go,this)
     {}

      void go()
      {
          while(keep_going)
             check a std::condition_variable and do some work;
      }
      bool keep_going;
      std::thread my_thread;
}
Run Code Online (Sandbox Code Playgroud)

注意,它keep_going是在线程对象之前声明的,应该true在线程进入go函数时设置为.这很好,似乎工作正常.

但是,这是多线程代码,并且偏执是值得的,所以我有两个问题:

1依赖这样的初始化顺序是否安全?没有处理线程,我的真实对象没有意义,所以我想在构造函数中设置它.

2当代码依赖于初始化顺序等相对模糊的东西时,给别人提供代码是不安全的吗?

Bat*_*eba 5

  1. 按标准是安全的.

  2. 非常不安全.很少有人知道这一点,维护你的头文件的人可能会给成员重新排序带来灾难性的后果.

我不会依赖它.