gpt4 book ai didi

C++ OpenMP 每个线程从私有(private)结构对象打印

转载 作者:行者123 更新时间:2023-11-30 02:36:36 35 4
gpt4 key购买 nike

我是 OpenMP 的新手,我想制作多线程程序。所以我有txt文件

London 2
A
B
Miami 3
C
D
E

当我读取文件时,我将所有数据放入名为 LetterStructstruct

struct LetterStruct{
string city;
int nr;
string letters[ARRAY_SIZE];
};

我想像这样打印我的数据(我知道每次运行我的程序时顺序都会不同)

thread_0 A
thread_0 B
thread_1 C
thread_1 D
thread_1 E

所以每个线程都应该打印城市的字母之一(例如线程 0 应该打印伦敦,线程 1 应该打印迈阿密字母)

这就是我所做的

void setUpThreads(int arraySize) {
LetterStruct letter;
omp_set_num_threads(2); // number of threads 2 (because 2 Miami and London)
for (int j = 0; j < 1; j++) {
#pragma omp parallel private(letter)
{
int id = omp_get_thread_num();
letter = letterArray[j]; // get struct info
for (int i = 0; i < ARRAY_SIZE; i++) {
cout << "thread_" << id << " " << letter.letters[i] << endl;
}
}
}
}

这是我的结果

thread_0 thread_1 A
A
thread_0 thread_1 B
B
thread_0 thread_1 C
thread_1 C
thread_0 thread_1 D
thread_1 D
thread_0 thread_1 E
thread_1 E

这两个线程似乎都有迈阿密和伦敦的信件信息(但我将此设置为 private(letter))并且出于某种原因,所有内容都打印不正确......那我错过了什么?

最佳答案

目前,您的线程正在重复工作。也就是说,他们都在做完全相同的事情。 #pragma omp parallel 所做的是告诉代码为每个线程执行括号中的所有操作。这不是你想要它做的。相反,将 #pragma omp parallel private(letter) 替换为 #pragma omp parallel for private(letter) 就在 for 循环上方。这将告诉您的代码将循环的每次迭代拆分到不同的线程。

关于C++ OpenMP 每个线程从私有(private)结构对象打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32531163/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com