C++; 我目前正在使用C++的WordPoT程序,但目前我已陷入困境。 当我只使用一个线程时,它可以工作,但如果我增加想要使用的线程数量,它就不能工作。当我启动程序时,我会给它我想要使用的线程数量和我想要读取的文件路径

C++; 我目前正在使用C++的WordPoT程序,但目前我已陷入困境。 当我只使用一个线程时,它可以工作,但如果我增加想要使用的线程数量,它就不能工作。当我启动程序时,我会给它我想要使用的线程数量和我想要读取的文件路径,c++,multithreading,c++11,race-condition,C++,Multithreading,C++11,Race Condition,在这部分代码中,我初始化了线程 for (int i = 0; i < numberOfThreads; i++) { input.push_back(map<string, info>()) ; jobInfo tmp; tmp.id = i; tmp.job = thread(counterino, filePath, numberOfThreads, tmp.id, &input[i]); jobs.push_back(mo

在这部分代码中,我初始化了线程

for (int i = 0; i < numberOfThreads; i++) {
    input.push_back(map<string, info>()) ;
    jobInfo tmp;
    tmp.id = i;
    tmp.job = thread(counterino, filePath, numberOfThreads, tmp.id, &input[i]);
    jobs.push_back(move(tmp));
}
for(inti=0;i
正如您所看到的,我给每个线程提供了它自己对映射的引用,之所以这样做是因为我想避免竞争条件(同时我想在所有线程完成后将映射减少为一个映射)。结构信息包含单词的数量和它出现在哪一行。到目前为止,代码的这一部分工作正常

这部分代码应该读取文本文件中的单词,并将其保存在我传递给它的映射引用中。这也适用于aspected,但仅当我想要使用的线程数量正好是一个线程时

如果我使用多个线程,它不会在任何贴图中保存任何内容,这是我没有得到的部分

while (file >> word) {
    //cout << word << "   " << threadId << endl;
    if (file.peek() == '\n'){
        line++;
    }
    tmp = input->operator[](word);
    tmp.word = word;
    tmp.numberOfOccurences += 1;

    tmp.lineOfOccurence.push_back(line);

    input->operator[](word) = tmp;
}
while(文件>>word){

//你是否可以使用输入。push_back(…)和以后使用&input[i],这可能会导致未定义的行为(取决于是否没有使用input.reserve),因为push_back(在下一个循环迭代中)通常会使输入的迭代器无效。什么是
input
?input是一个映射向量。我应该使用&input.at(i)吗?无论如何,我将读入vector.reserve();