【发布时间】:2018-05-04 12:45:07
【问题描述】:
我需要一种一致的方式来重置我的程序创建的所有线程局部变量。问题在于线程本地数据是在不同于使用它们的地方创建的。
我的程序大纲如下:
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()?
【问题讨论】:
-
这个方法对我来说很好。
-
为什么你想这样做?
data_t代表什么以及如何在并行区域之间使用它?为什么突然想清零?你所做的事情听起来很危险……在很多情况下,两个并行区域之间的线程私有变量的生命周期和值是未指定的。 -
@Zulan
data_t是一个包含计算的lru缓存;这些计算,如果没有预先计算/记忆,对于后续用户的每次计算都会触发数百万次(参见user函数)。每次发生特定操作时,这些计算都会变得无效,并且必须清除缓存。
标签: c++ multithreading openmp