所以我有这个课:
class foo {
public:
foo() { };
void me1() const {
while(1) {
std::lock_guard<std::mutex> ldock(m);
std::cout << 0;
}
}
void me2() const {
while(1) {
std::lock_guard<std::mutex> ldock(m);
std::cout << 1;
}
}
private:
std::mutex m;
};
现在,我想在两个不同的线程中运行这两个方法,我这样做是这样的:
int main() {
foo myfoo;
std::thread firstThread(&foo::me1, &myfoo);
std::thread secondThread(&foo::me2, &myfoo);
firstThread.detach();
secondThread.detach();
//while(1) { }
return 0;
}
我不想等待这两种方法中的任何一种完成,它们将同时运行,直到主线程被杀死。
在主线程末尾有某种无限循环可以吗?(如评论while(1) {}
)。
还是应该调用某种sleep
函数?
如果你想确定这两个线程完成你最好的选择实际上是没有到detach()
线程,而是join()
他们在离开主线程之前。也就是说,您将同时启动两个线程,并且它们将同时运行,一旦启动您就简单地将join()
每个线程启动。当然,这假定线程将终止。
detach()
有效拥有ed线程意味着您永远无法确定它是否已完成。这通常是很少有用,我认为这是一个错误的detach()
加入std::thread
。但是,即使使用detach()
ed线程,您也无需忙碌就可以识别何时实现目标。为此,您需要设置适当的变量来指示完成情况或进度,并使用来保护它们std::mutex
。主线程将随后wait()
在std::condition_variable
其被notify_once()
用在完成/进度更新相应的线程将要在合理的时间间隔进行编。一旦所有线程都表明它们已经完成或达到了适当的目标,main()
线程就可以完成。
通常,单独使用计时器不是一个好的方法。线程之间的信令通常是更可取的,并且倾向于创建一个更响应的系统。您仍然可以使用wait()
(wait_until()
或wait_for()
)的定时版本,例如,在怀疑线程以某种方式挂起或超时时发出警报。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句