我已經通過了一些線程教程,但很好奇一件事。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 /內核以及系統的總體負載是多少。 –