Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重置OpenMP中的线程局部变量_C++_Multithreading_Openmp - Fatal编程技术网

C++ 重置OpenMP中的线程局部变量

C++ 重置OpenMP中的线程局部变量,c++,multithreading,openmp,C++,Multithreading,Openmp,我需要一种一致的方法来重置程序创建的所有线程局部变量。问题在于线程本地数据是在不同的地方创建的,而不是在使用它们的地方 我的课程大纲如下: struct data_t { /* ... */ }; // 1. Function that fetches the "global" thread-local data data_t& GetData() { static data_t *d = NULL; #pragma omp threadprivate(d); // !

我需要一种一致的方法来重置程序创建的所有线程局部变量。问题在于线程本地数据是在不同的地方创建的,而不是在使用它们的地方

我的课程大纲如下:

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()); 
    }
}

是否有更惯用/安全的方法来实现
ClearThreadLocalData()

您可以为数据创建并使用全局版本号。每次需要清除现有缓存时,将其递增。然后修改
GetData
,如果存在现有数据对象,则检查版本号;如果现有数据对象过期,则丢弃现有数据对象并创建新数据对象。(如果您可以修改类,则分配的
data\u t
对象的版本号可以存储在
data\u t
中,如果不可以,则存储在第二个线程局部变量中。)您将得到如下结果

static int dataVersion;

data_t& GetData()
{
    static data_t *d = NULL;
    #pragma omp threadprivate(d); // !!!

    if (d && d->myDataVersion != dataVersion) {
        delete d;
        d = nullptr;
    }
    if (!d) { 
        d = new data_t();
        d->myDataVersion = dataVersion;
    }

    return *d;
}
这并不取决于
data\u t
中是否存在
Clear
方法,但如果有方法,请使用调用
Clear
替换删除和重置。我使用
d=nullptr
来避免重复对
新数据的调用

如果要避免使用全局变量,全局
dataVersion
可以是
data\u t
的静态成员,如果需要,它可以是原子的,尽管
GetData
需要更改才能处理该变量

当需要重置数据时,只需更改全局版本号:

++dataVersion;

我觉得这个方法不错。你为什么要这样做?
data\u t
代表什么?如何在平行区域之间使用它?你为什么突然想清除它?你所做的听起来很危险。。。在许多情况下,两个并行区域之间的threadprivate变量的生存期和值未指定。@Zulan
data\u t
是一个包含计算的lru缓存;这些计算,如果没有预计算/记忆,对于后续用户的每次计算都会触发数百万次(请参见
user
函数)。每次特定操作发生时,这些计算都将无效,必须清除缓存。
++dataVersion;