Мне нужен согласованный способ сброса всех локальных переменных потока, создаваемых моей программой. Проблема заключается в том, что локальные данные потока создаются в местах, отличных от того, где они используются.
Моя программа выглядит следующим образом:
struct data_t { /* ... */ };
// 1. Function that fetches the "global" thread-local data
data_t& GetData()
{
static data_t *d = NULL;
#pragma omp threadprivate(d); // !!!
if (!d) { d = new data_t(); }
return *d;
}
// 2 example function that uses the data
void user(int *elements, int num, int *output)
{
#pragma omp parallel for shared(elements, output) if (num > 1000)
for (int i = 0; i < num; ++i)
{
// computation is a heavy calculation, on memoized data
computation(GetData());
}
}
Теперь, моя проблема в том, что мне нужна функция, которая сбрасывает данные, то есть каждый созданный локальный объект потока должен учитываться.
На данный момент мое решение состоит в том, чтобы использовать параллельную область, которая, как мы надеемся, использует равное или большее количество потоков, чем «параллельное для», поэтому каждый объект «повторяется» через:
void ClearThreadLocalData()
{
#pragma omp parallel
{
// assuming data_t has a "clear()" method
GetData().clear();
}
}
Есть ли более идиоматичный / безопасный способ реализации ClearThreadLocalData()
?