在c ++ 11中查找线程示例时,每个示例都会加入线程。
我是否需要加入主题?
更多信息
我在'游戏循环'中创建线程,因此在线程完成执行之前程序不太可能退出。线程函数完成执行后,我可以设置一个像done
?
例如
请在此处使用此示例.Foo仅在已加载时绘制:
struct Foo {
std::atomic<bool> isLoaded = false;
void load() {
std::thread( [&isLoaded] () {
doSomethingExpensive();
isLoaded = true;
});
}
void draw() {
if ( !isLoaded ) { return; }
}
}
void App::setup() {
for ( int i = 0; i<100; ++i ) {
std::shared_ptr<Foo> fooPtr;
fooPtr->load();
fooPtrs.push_back( fooPtr );
}
}
void App::loop() {
for ( auto &foo : fooPtrs ) {
fooPtrs->draw();
}
}
这是合适的/良好的做法/一个好的策略吗?
答案 0 :(得分:2)
这将导致您的程序退出。当一个线程超出范围时,如果它没有被连接或分离,它将导致程序终止。你可以分离线程,但是你无法访问它。更好的解决方案是使线程成为类的成员,以便在创建它之后不会超出范围。只要你确保它被正确清理,那么就不需要加入。