我是OpenMP的新手,我想制作多线程程序。所以我有txt文件
London 2
A
B
Miami 3
C
D
E
当我阅读我的文件时,我将所有数据都放入struct
LetterStruct
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)
)并且由于某种原因,所有内容都打印错误...所以我错过了什么?
答案 0 :(得分:3)
目前,您的主题正在重复工作。也就是说,他们都在做同样的事情。 #pragma omp parallel
所做的是告诉代码在每个线程的封闭括号中执行所有操作。这不是你想要它做的。而是将#pragma omp parallel private(letter)
替换为#pragma omp parallel for private(letter)
循环上方的for
。这将告诉您的代码将循环的每次迭代拆分为不同的线程。