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

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

本文关键字:问题 std 向量 线程 组合 单词 C++11 计算      更新时间:2023-10-16

我正在尝试实现一个并发程序来计算文本文件中单词和字母的双组合词的出现次数。核心是计算双字母的两个函数。在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 .Textdorian.txt 4 /letters
398 y,t .Textdorian.txt 2 /letters
33 a, few .Textdorian.txt 3 /words
66 a, few .Textdorian.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)));

现在它可以工作