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

C++ OpenMP each thread print from private struct object

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

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