簡體   English   中英

如何在共享資源作為參數的for循環中使用std future和異步線程?

[英]How to use std future and async with threading in a for loop with a shared resource as param?

我在線程實踐項目中遇到了一個實現問題。 我知道我想要實現什么,但我不知道如何實現。 我是 std::future 和 std::async 主題的新手,所以我什至不確定是否可以按照我想象的方式實現。

我有一個具有此功能的 NuclearPP class(它應該是 staright forwad)。

    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 class 和一個產生能量的 function:

 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;
   }
}


在這里閱讀更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM