gpt4 book ai didi

c++ - 在 C++ 中计算一次后跨多个线程共享只读数据

转载 作者:行者123 更新时间:2023-11-30 04:54:09 25 4
gpt4 key购买 nike

我是多线程编程的新手,需要一些关于我遇到的这个问题的指导。

我有一个计算成本很高的对象,所以我想做的是只在需要时计算它,一旦计算完成,如果另一个线程需要它,就与读访问共享它。我只知道在运行时需要计算哪些输入。

所以我的基本想法是这样的

class ExpansiveDoubleCalc
{
private:
static double *ptr[10];
double DoExpansiveCalc(int input)
{
double expansivecalc = (123.4 * input);
return expansivecalc;
}

public:
ExpansiveDoubleCalc(int input, double* output)
{
if(ptr[input]==NULL)
*ptr[input] = DoExpansiveCalc(input);
output = ptr[input];
}

};

double * ExpansiveDoubleCalc::ptr[10]{};

假设我只需要输入 <10。从我对多线程的了解来看,这有很多问题:* 线程可以尝试同时运行 DoExpansiveCalc* 一旦他们得到一个计算后的输出指针,如果多个线程试图访问它,它可能会很慢

这样对吗?我如何确保它安全?另外,我应该在这里返回一个 const 指针,对吧?有什么好办法吗?

感谢帮助!!干杯!

最佳答案

现代 cpp 中基于常规锁的解决方案:https://gcc.godbolt.org/z/SsQaEB

一些注意事项:

  1. 我在运行时设置大小。如果您在编译时知道大小,请更改为 std::array
  2. 通常不推荐使用静态全局状态。使用 rawptr 或 std::shared_ptr 显式共享对象。

#include<mutex>
#include<vector>

class ExpensiveDoubleCalc {
public:
ExpensiveDoubleCalc(size_t size) : data(size){
}

static double DoExpensiveCalc(int input) {
return 123.4 * input;
}

double get(int input) {
return data.at(input).get(input);
}

private:
struct Data {
bool isSet{false};
double val;
std::mutex m;
double get(int input){
std::lock_guard<std::mutex> lock{m};
if(isSet){
return val;
} else {
val = DoExpensiveCalc(input);
isSet = true;
return val;
}
}
};
std::vector<Data> data;

};

关于c++ - 在 C++ 中计算一次后跨多个线程共享只读数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53671397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com