- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我不知道如何使结构或对象成为线程私有(private)的,我正在做的事情会产生错误:
struct point2d{
int x;
int y;
point2d(){
x = 0;
y = 0;
}
//copy constructor
point2d(point2d& p){
x = p.x;
y = p.y;
}
};
我声明了一个静态结构并尝试使它们成为线程私有(private)的
static point2d myPoint;
#pragma omp threadprivate(myPoint)
它会产生一个错误:
error C3057: 'myPoint' : dynamic initialization of 'threadprivate' symbols is not currently supported
这是否意味着当前的 openmp 编译器不支持将 struct threadprivate 设为私有(private)?或者我做的是错的。是否有任何替代方法来传递结构或对象?
这是我的代码的其余部分:
void myfunc(){
printf("myPoint at %p\n",&myPoint);
}
void main(){
#pragma omp parallel
{
printf("myPoint at %p\n",&myPoint);
myfunc();
}
}
最佳答案
在 C++ 中,具有方法的结构是默认为公共(public)的类。这不是 plain-old-data (POD) . MSVC seems to imply that it can handle threadprivate objects (i.e. non-POD)但我似乎无法让它工作。我确实让它在 GCC 中像这样工作:
extern point2d myPoint;
#pragma omp threadprivate(myPoint)
point2d myPoint;
但是有一个变通办法可以与 MSVC(以及 GCC 和 ICC)一起工作。您可以使用 threadprivate 指针。
threadprivate 的目的是为每个线程提供私有(private)版本的对象/类型,并使值在并行区域之间保持不变。您可以通过 delcaring 指向 point2d
的指针,使该线程私有(private),然后为并行区域中的每个线程的私有(private)指针分配内存来做到这一点。确保在上次并行调用时删除分配的内存。
#include <stdio.h>
#include <omp.h>
struct point2d {
int x;
int y;
point2d(){
x = 0;
y = 0;
}
//copy constructor
point2d(point2d& p){
x = p.x;
y = p.y;
}
};
static point2d *myPoint;
#pragma omp threadprivate(myPoint)
int main() {
#pragma omp parallel
{
myPoint = new point2d();
myPoint->x = omp_get_thread_num();
myPoint->y = omp_get_thread_num()*10;
#pragma omp critical
{
printf("thread %d myPoint->x %d myPoint->y %d\n", omp_get_thread_num(),myPoint->x, myPoint->y);
}
}
#pragma omp parallel
{
#pragma omp critical
{
printf("thread %d myPoint->x %d myPoint->y %d\n", omp_get_thread_num(),myPoint->x, myPoint->y);
}
delete myPoint;
}
}
关于c++ - 如何在 OpenMP 中将对象或结构定义为 threadprivate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23552077/
我是一名优秀的程序员,十分优秀!