我很好奇为什么这会在 4 次运行中大约运行 1 次时崩溃。
我有一个简单的类,它返回一个带有线程 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();
}
我意识到将 async 与引用一起使用是危险的,但我认为如果不写入任何内容会很安全。我认为我的错误可能来自 lambda 本身。这主要是一个测试 async 和 lambdas 功能的程序。
所以我的主要问题是: 1)为什么会崩溃? 2) 有什么更好的方法可以做到这一点?
最佳答案
为什么会崩溃?
results.push_back(async([&]{return srs[i].run();}));
该行中对 srs
的引用没有任何问题;正如你所说,它没有被修改。但是对 i
的引用是完全没有意义的; i
在 lambda 执行时可能不再存在,其值将不可预测。
但我不明白为什么您觉得需要多个 StringReturner
。该类没有状态,run
方法也可能是静态的,因为它产生了所有差异。
有什么更好的方法可以做到这一点?
具体做什么?
关于c++ - 与引用 lambda 崩溃异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17463232/