【发布时间】:2015-09-30 15:44:31
【问题描述】:
根据 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;
}
注意keep_going是在线程对象之前声明的,应该在线程进入go函数时设置为true。这很好,似乎工作正常。
但是,这是多线程代码,偏执是值得的,所以我有两个问题:
1 这样依赖初始化顺序是否安全?没有处理线程,我的真实对象没有意义,所以我想在构造函数中设置它。
2 当代码依赖于相对模糊的东西(如初始化顺序)时,将代码提供给他人是否不安全?
【问题讨论】:
-
初始化顺序并不晦涩,定义明确,这段代码没有错。
-
1) 是的,初始化顺序是规范的一部分,2) 是 - 清晰的文档可能会有所帮助
-
我只会依靠它并提供良好的评论解释。遵循这句话“永远像你的代码管理员一样的代码是一个知道你住在哪里的连环杀手”