我很好奇为什么这会在大约 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 本身。这主要是一个测试 async 和 lambdas 功能的程序。
所以我的主要问题是:1)为什么会崩溃?2)有什么更好的方法可以做到这一点?