c++ - 与引用 lambda 崩溃异步

标签 c++ asynchronous lambda crash

我很好奇为什么这会在 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/

相关文章:

c++ - 对论文有什么想法吗?

java - Spring异步线程 hibernate

javascript - Q promise 中的并发限制 - Node

c++ - boost asio async_tcp_echo_server 示例

C# 等待 lambda 回调完成

c# - IEnumerable Group 按用户指定的动态键列表

c++ - 在 Arduino 上执行多个函数/命令

c++ - 为什么下面的类模板在 Visual Studio 2019 中编译,而在 gcc 8.3 中没有?

c++ - 绕过派生类中 C++ 方法的常量性

python - 通过 lambda 回调在 Scrapy 蜘蛛内部传递参数