Я очень новичок в многопоточном программировании и мне нужно несколько советов по этой проблеме, с которой я сталкиваюсь.
У меня есть этот объект, который нужно вычислять дорого, поэтому я хочу вычислить его только в случае необходимости, а затем рассчитать, поделиться им с доступом для чтения, если это понадобится другому потоку.Я знаю только, для каких входных данных мне нужны вычисления во время выполнения.
Так что моя основная идея была примерно такой:
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 одновременно * как только они получают вычисленный указатель для вывода обратно, это может быть медленным, если несколько потоков пытаются получить к нему доступ </p>
Это правильно?Как я могу сделать это безопасно?Кроме того, я должен, вероятно, вернуть указатель const здесь, верно?Есть ли хороший способ сделать это?
Спасибо за помощь!Ура!