我很好奇,爲什麼會崩潰在大約1個運行在4異步參考拉姆達崩潰
我有一個簡單的類,返回一個線程ID的字符串。 該類在lambda中異步調用另一個類並返回結果。代碼很簡單,只要我能做到 - 我仍然在學習:
class String_Returner
{
public:
string run() const
{
return "I returned from thread "+to_string(this_thread::get_id());
}
};
class Class_Holder
{
public:
Class_Holder() : number_of_runs(10)
{
srs.resize(number_of_runs);
}
void concurrent_srs()
{
for (int i = 0; i < number_of_runs; i++)
{
results.push_back(async([&]{return srs[i].run();}));
}
for (int i = 0; i < results.size(); i++)
{
cout << i << ") " << results[i].get() << endl;
}
results.clear();
}
private:
vector<future<string>> results;
vector<String_Returner> srs;
const int number_of_runs;
};
void class_b_test()
{
Class_Holder ch;
ch.concurrent_srs();
}
我意識到使用異步與參考是危險的,但我想它會是安全的,如果沒有被寫入。我想我的錯誤可能來自lambda本身。這主要是一個測試異步和lambdas功能的程序。
所以我的主要問題: 1)爲什麼它崩潰? 2)有什麼更好的方法來做到這一點?
該程序的要點是測試lambas和併發性。我不存在很可能是這裏的關鍵。如果我通過我作爲副本,而不是一個參考,應該工作,對嗎?我想我會去試試:) – David
@David:你可以將'i'作爲副本,或者你只是總是使用相同的lambda。我沒有看到有兩個lambda引用兩個不同的無狀態類實例來測試任何東西。如果你想看到不同的StringReturner對象被引用,你必須在對象中放入一些狀態,以便lambdas可見地引用不同的對象。 – rici
我還在學習lambda,這就是整個問題的來源。基本上我知道這些東西是作爲參考傳遞的,但是甚至沒有想到'我'。我今天對這個主題做了一些解讀。我會接受這個答案,因爲它最接近我所要求的。 – David