我已经浏览了一些线程教程,但对一件事感到好奇。
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 之间的某个时间运行?如果在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(); }
};
我正在考虑适当的位置可能在线程函数的末尾,因为不再需要 Child 但是如果您尝试从其内部销毁线程会发生什么?我猜这听起来像个坏主意。我怎么知道什么时候可以删除我的线程?有更好的方法吗?
修改了上面的代码以反映下面的建议。
我现在意识到教程所讨论的关于抛出异常的内容,所以我应该使用互斥锁而不是 mtx.lock() 我猜。