Глобальные переменные вообще говоря совершенно не нужны, поэтому давайте даже не будем go там - все, что вы можете сделать, используя их, может быть сделано путем передачи ссылки на объект контекста при создании новых объектов.
Поскольку операции взаимно независимы, вам нужно распараллелить их, поэтому у вас есть только три варианта, которые будут работать хорошо: переменная члена класса, локальная переменная потока c или автоматическая c переменная. Размер массива составляет 400 МБ (10e3 ^ 2 * 4 = 100e6 * 4), поэтому он просто не будет работать как автоматическая переменная c - у вас обычно не хватает стека.
Таким образом:
class ProcessData {
public:
static constexpr int N = 10000;
using Matrix = std::array<std::array<int, N>, N>;
void update(Data &data) {
thread_local static Matrix matrix;
// ...
}
};
Недостатком является то, что в зависимости от реализации среды выполнения C ++, matrix
может быть выделено при запуске каждого потока, и вы не можете wi sh это тот случай, когда на карту поставлено 400 МБ.
Таким образом, вы можете sh выделить его только по требованию:
// .h
class ProcessData {
public:
static constexpr int N = 10000;
using Matrix = std::array<std::array<int, N>, N>;
private:
thread_local static std::unique_ptr<Matrix> matrix;
public:
void update(Data &data) {
if (!matrix) matrix.reset(new Matrix);
//...
}
};
// .cpp
thread_local std::unique_ptr<ProcessData::Matrix> ProcessData::matrix;
Матрица будет освобождена всякий раз, когда поток заканчивается (например, рабочий поток в пуле потоков), но также может быть явно освобожден: matrix.reset();