C ++ OpenMP每个线程都从私有struct对象打印

时间:2015-09-11 19:51:29

标签: c++ multithreading openmp

我是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))并且由于某种原因,所有内容都打印错误...所以我错过了什么?

1 个答案:

答案 0 :(得分:3)

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