我已经通过了一些线程教程,但很好奇一件事。std ::线程何时执行线程?
std::thread Child([](){ std::cout << "When am I executed?" << std::endl << std::endl; });
//Some other code
Child.join();
//I'm guessing now my thread would be running
当我打电话join()
还是它正在创建时的线程,当我打电话加入之间的某个时候运行正在执行的线程?如果在调用join()
时执行它,只是为了检查我的理解,它告诉要执行的部分,并且程序在主线程上继续,并且最终子线程在主线程正在使用的同一内存上完成了一些工作?
如果我想为泛型类创建一个包装,我会想要做类似下面的事情,但我似乎无法完全弄清楚。我对内存管理线程感到困惑。
class Sync {
private:
int val;
public:
Sync() : val(0) {}
void Inc() {val++}
int Value() { return val; }
};
class Async {
private:
Sync Foo;
std::mutex mtx;
std::vector<std::thread*> Children;
public:
//I would need a new thread each time I called Inc
void Inc() {
Children.push_back(new std::thread([&]() {
mtx.lock();
Foo.Inc();
mtx.unlock();
}));
}
//But how do I know when it is safe to delete Child?
int Value() {
for(auto& thds : Children) {
thds->join();
delete thds;
}
Children.clear();
return Foo.Value(); }
};
我正在考虑一个合适的位置可能是在线程函数结束,因为孩子将不再需要,但如果你试图从内部摧毁自身的线程会发生什么?我猜这听起来会像一个坏主意一样。我怎么知道什么时候可以删除我的线程?有更好的方法吗?
修改上面的代码以反映来自下面的建议。
我现在已经意识到教程中关于抛出异常的问题,所以我应该使用互斥锁而不是mtx.lock()。
然后线程一旦创建就开始运行?另外,我可以在加入呼叫后调用删除。 谢谢 – Chemistpp
是的,我刚刚编辑了答案,以澄清该线程可能会在创建完成之前启动,或者稍后再完成。这完全取决于系统中有多少个CPU /内核以及系统的总体负载是多少。 –