微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在共享资源作为参数的for循环中使用std future和async与线程?

如何解决如何在共享资源作为参数的for循环中使用std future和async与线程?

我在线程实践项目中遇到了一个实现问题。我知道我想实现什么,但我不知道如何实现。我是 std::future 和 std::async 主题的新手,所以我什至不确定实现是否可能以我想象的方式实现。

我有一个具有此功能的NuclearPP类(应该是正视)。

    const error_codes::PPErrorCode& NuclearPowerPlant::Operation(const float& power_required,float& 
    power_generated)
    {
        error_codes::PPErrorCode power_plant_error_code = error_codes::success;

        float energy_required_per_core = power_required / (float)operating_generators_; 

        for (const auto& core_it : reactor_cores_)
        {
            //Threaded call of each core's GenerateEnergy(energy_required_per_core,power_generated)
        }

        //Error handling per core with param power_plant_error_code

        return power_plant_error_code;
    }

我还有一个 NPPCore 类,它有一个产生能量的函数

 const error_codes::NPPCoreErrorCode& GenerateEnergy(const float& energy_required_per_core,float& 
 produced_energy)
 {
     //Compliacted stuff which adds the generated energy to the shared resource "produced_energy" received as a param
 }

我的问题是:如何为每个 core_it->GenerateEnergy(energy_required_per_core,power_generated) 启动一个线程。

非常感谢你。如果您需要更多信息,请随时询问。

溴, 史蒂夫

解决方法

首先 - 定义每个线程应提供的信息。

在这种情况下 - 可能是这样的:

struct Result
{
     error_codes::NPPCoreErrorCode error;
     float produced_energy;
};

所以你未来的类型是std::future<Result>

然后在多个线程中开始您的工作:

std::vector<std::future<Result>> results;
for (const auto& core_it : reactor_cores_)
{
    auto action = [&]{
        Result res; 
        res.error = core_it.GenerateEnergy(energy_required_per_core,res.power_generated);
        return res;
    };
    // start thread
    results.emplace_back(std::async(std::launch::async,action));
}

然后等待每个线程完成:

  for (auto& f : results) f.wait();

那么,我猜你想总结一下:


 for (auto& f : results) {
    Result res = f.get();
    if (res.error == error_codes::success)
       power_generated += res.power_generated;
    else {
       power_plant_error_code = res.error;
       // depending on your error strategy,you might break here
       break;
   }
}


阅读更多here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?