如何在共享资源作为参数的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 主题的新手,所以我什至不确定是否可以按照我想象的方式实现。
我有一个NuclearPPclass有这个功能(应该是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,它具有产生能量的功能:
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).
启动一个线程
非常感谢转发。如果您需要更多信息,请随时询问。
Br,
史蒂夫
首先 - 定义每个线程应提供的信息。
在这种情况下 - 可能是这样的:
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。
我在线程实践项目中遇到了一个实现问题。我知道我想要实现什么,但我不知道如何实现。我是 std::future 和 std::async 主题的新手,所以我什至不确定是否可以按照我想象的方式实现。
我有一个NuclearPPclass有这个功能(应该是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,它具有产生能量的功能:
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).
启动一个线程非常感谢转发。如果您需要更多信息,请随时询问。
Br, 史蒂夫
首先 - 定义每个线程应提供的信息。
在这种情况下 - 可能是这样的:
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。