[英]How to finalize std::async
這是示例代碼:
struct T
{
T()
{
task = std::async(std::launch::async, [this]()
{
while(work)
{
//do something
}
});
}
~T()
{
work = false;
}
std::future<void> task;
std::atomic_bool work;
};
我應該以某種方式最終確定析構函數中的未來還是上面的代碼可以嗎?
您顯示的代碼不正確,但是由於您可能會想到的原因。 由於task
所指的共享狀態是由std::async
創建的,因此銷毀task
時std::future
將被阻止。 但這仍然無濟於事。
問題在於類的成員以與初始化相反的順序被銷毀。 由於work
是最后初始化的,因此它將在 task
之前銷毀。 因此,即使將其設置為false
,當它在循環中運行檢查時,您的任務實際上實際上仍是在引用死對象。 這樣一來,您手中的行為就會變得不確定。
您可以通過移動解決問題work
以前task
,所以它的壽命更長。 或者,您可以在T
的析構函數中顯式調用task.wait()
。 就個人而言,我認為后者更為明確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.