【发布时间】:2017-07-11 15:39:48
【问题描述】:
如下:
void test()
{
std::chrono::seconds dura( 20 );
std::this_thread::sleep_for( dura );
}
int main()
{
std::thread th1(test);
std::chrono::seconds dura( 5 );
std::this_thread::sleep_for( dura );
return 0;
}
main 将在 5 秒后退出,仍在执行的 th1 会发生什么?
即使您在main 中定义的th1 线程对象超出范围并被销毁,它是否会继续执行直到完成?
th1 是在它完成执行后简单地坐在那里,还是在程序终止时以某种方式被清理?
如果线程是在函数中创建的,而不是在 main 中创建的 - 线程是否会一直保留到程序终止或函数超出范围?
如果您想在线程上执行某种类型的超时行为,那么简单地不为线程调用 join 是否安全?
【问题讨论】:
-
你为什么不试试呢?
-
@Drop 因为那不是了解保证的可靠方法。
-
@dyp 对 Stackoverflow 的询问都不是。通过编译运行这个 5 行的例子,至少他能找到一点线索。只有一个保证来源——一个标准。
-
@Drop “在 Stackoverflow 上询问都不行” 好吧,在我看来,一个好的 SO 答案引用了一个可靠的来源(就像你所做的那样)。然而,甚至标准本身也不是完全可靠的来源,因为它包含缺陷。编译器提供者通常会偏离字面解释,例如合并缺陷报告的建议解决方案。由于 Undefined Behaviour 的存在,我认为通过尝试来了解保证并不是一个好习惯。
-
我想“你为什么不试试呢?”是一个完全有效的回答,如果它表明 OP 在询问之前已经费心进行一些实验,这个问题将会得到改善。 “我试过了,我的程序终止了,这是预期的吗?”是一个比“如果我这样做会发生什么?”更好的问题。我们不是在谈论吃一些野生的、身份不明的浆果,C++11 编译器是免费提供的,运行实验既简单又富有教育意义。
标签: c++ multithreading c++11 stdthread