我有這個測驗代碼來看看,如果一個承諾物件超出生命周期,它的未來物件會發生什么:
#include <chrono>
#include <future>
#include <iostream>
#include <thread>
using namespace std;
void getValue(future<int>& future) {
cout << "sub process 1 \n";
try {
cout << "sub process 2 \n";
int value = future.get();
cout << "sub process 3\n";
cout << value << endl;
} catch (future_error &e) {
cerr << e.code() << '\n' << e.what() << endl;
} catch (exception e) {
cerr << e.what() << endl;
}
cout << "sub process 4\n";
}
int main() {
thread t;
{
promise<int> plocal;
future<int> flocal = plocal.get_future();
t = thread(getValue, ref(flocal));
}
t.join();
return 0;
}
我希望在getValue
函式中,它要么列印 future::get 結果,要么拋出運行時例外并列印例外資訊,因為plocal
在“main”中已被破壞。
實際上,這個程式列印:
sub process 1
sub process 2
并結束。
uj5u.com熱心網友回復:
您的問題與std::promise
行為無關std::future
。
flocal
您只需通過將物件按參考傳遞給執行緒,在執行緒中訪問它,同時在主執行緒中銷毀它而不進行任何同步,從而導致資料競爭(以及因此未定義的行為) 。
無論物件是什么型別或種類,這都不起作用flocal
。
通過以下方式傳遞std::future
副值std::move
:
void getValue(future<int> future)
/*...*/
t = thread(getValue, std::move(flocal));
通過此更改,解構式std::promise
將在共享狀態中存盤std::future_error
例外,并且get
執行緒中的未來將接收并拋出它。
如果你將一些東西傳遞std::ref
給一個執行緒,你總是必須確保被參考的物件比執行緒長,或者你需要確保有一些同步機制來確定主執行緒何時可以銷毀物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/495873.html
下一篇:將非動態分配的物件推送到指標向量