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

Posted

技术标签:

【中文标题】C++11 中 std::threads 向量的问题计算字母和单词的二元组【英文标题】:Problems with a vector of std::threads in C++11 counting bigrams of letters and words 【发布时间】:2017-01-27 11:27:36 【问题描述】:

我正在尝试实现一个并发程序来计算文本文件中单词和字母二元组的出现次数。核心是计算二元组的两个函数。在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

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

【问题讨论】:

程序有多大?你能把所有的都贴出来吗? 程序不是很大,代码的其他部分工作,因为程序工作在顺序版本,所以我认为错误不存在 你标记了这个 C++11...你为什么不使用更多的 C++11?喜欢for(auto &amp;thread: threads) thread-&gt;join(); delete thread; 。此外,您可以让向量本身保存线程对象而不仅仅是指针,使用threads.emplace_back(stentence_bigrams_letters, ...); @G.Sliepen:并且使用实际线程对象的vector,而不是指针,也意味着您无需担心手动内存管理;你需要join,但你不能忘记(或意外绕过)内存释放。将std::move 用于您无论如何都会扔掉的东西也会节省一些周期/内存流失。 @ShadowRanger 所以如果我使用一组实际线程,之后我不需要删除线程? 【参考方案1】:

我解决了这个问题。 问题是我将字符串 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)));

现在可以了

【讨论】:

以上是关于C++11 中 std::threads 向量的问题计算字母和单词的二元组的主要内容,如果未能解决你的问题,请参考以下文章

独立 std::threads 的 C++ std::vector

如何等待几个 std::threads

C++11 静态局部变量和线程

可以从 Windows DLL 中的全局变量创建/销毁 std::threads 吗?

c++11 函数调用中的向量初始化

C++11 线程:将向量传递给线程函数时出错