作為偽代碼中的示例:
MultiThreadedWorker worker;
Foo()
{
const Vector position = CreatePosition();
worker.StartWorker(Position);
}
MultiThreadedWorker::StartWorker(const Vector& myPosition)
{
... Do a bunch of async work that keeps referencing myPosition ...
}
這似乎暫時有效,但我不明白為什么,因為 myPosition 似乎在 StartWorker 完成之前很久就不會指向任何東西。
假設這不安全,除了按值傳遞所有內容或確保所有內容都在堆上之外,還有其他解決方案嗎?
uj5u.com熱心網友回復:
std::async 復制 const 參考
所以是的,它是安全的。有關它為什么這樣做的討論,請參閱為什么 std::async 復制它的 const & 引數?
uj5u.com熱心網友回復:
程式員有責任確保變數存在足夠長的時間,以便在通過指標或參考進行任何訪問之前它不會被破壞。這至少可以通過以下方式之一來實作:
確保執行緒在銷毀變數之前結束。您可以在離開范圍之前在執行緒上運行 .join() 。
在堆上創建物件。使用創建它
make_shared并通過shared_ptr. 這確保了物件在最后一個參考被銷毀之前一直存在。
請注意,執行緒和共享物件還有另一個問題。如果一個執行緒在另一個執行緒讀取同一個物件時寫入,那么這是一個未定義行為的資料競爭。std::mutex可以使用諸如執行緒同步機制來避免這種情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504229.html
上一篇:vtable何時創建/填充?
下一篇:如何打破在標準輸入上監聽的回圈?
