C++11 中 std::threads 的向量计算字母和单词的双字母组的问题

Problems with a vector of std::threads in C++11 counting bigrams of letters and words

我正在尝试实现一个并发程序来计算文本文件中单词和字母的二元组出现次数。核心是计算二元组的两个函数。在 main 中,我使用两个函数之一启动线程。有一个 main for 启动线程并将它们推送到 vector.

std::vector<std::thread *> threads;
std::pair<std::string, int> current_job;


for (unsigned int i = 0; i < num_threads; i++) {
    current_job = filenames.front();// ex. <baskerville.txt, 1>
    filenames.pop();
    if (current_job.second == 0) {
        threads.push_back(new std::thread(sentence_bigrams_letters, std::cref(current_job.first), std::ref(v),
                                          std::ref(lock_chars)));
    } else if (current_job.second == 1) {
        threads.push_back(
                new std::thread(sentence_bigrams, std::cref(current_job.first), std::ref(m), std::ref(lock_words)));
    }

} 

for (unsigned int k = 0; k < threads.size(); k++) {
        threads.at(k)->join();
        delete (threads.at(k));
    }

有两个文本文件 baskerville.txtdorian.txt 所以 filenames 有一个一共4个元素。程序运行但打印线程的输出没有意义。每个线程打印特定二元组的计数以及二元组本身、他正在读取的文件名和他的 ID。这是输出:

199 y,t .\Text\dorian.txt 4 /letters
398 y,t .\Text\dorian.txt 2 /letters
33 a, few .\Text\dorian.txt 3 /words
66 a, few .\Text\dorian.txt 5 /words

这对我来说没有任何意义,所以如果有人知道发生了什么,那将非常有帮助。

我解决了这个问题。 问题是我将字符串 current_job.first 作为引用传递,并且引用在 for 循环迭代中被更改。 所以代替:

threads.push_back(new std::thread(sentence_bigrams_letters, std::cref(current_job.first), std::ref(v),
                                      std::ref(lock_chars)));

是:

threads.push_back(new std::thread(sentence_bigrams_letters, current_job.first, std::ref(v),
                                          std::ref(lock_chars)));

现在可以使用了