C ++中的线程程序并不快

时间:2016-05-30 22:06:57

标签: c++ multithreading

我有一个程序,它逐行读取文件,然后将每个可能的长度为50的子字符串及其频率存储在哈希表中。我尝试在我的程序中使用线程,以便它将读取5行,然后使用五个不同的线程来进行处理。处理涉及读取该行的每个子串并将它们放入具有频率的哈希映射中。但似乎有一些错误,我无法弄清楚哪个程序不比串行方法快。此外,对于大输入文件,它将被中止。这是我正在使用的代码

unordered_map<string, int> m;
mutex mtx;

    void parseLine(char *line, int subLen){
        int no_substr = strlen(line) - subLen;
        for(int i = 0; i <= no_substr; i++) {
            char *subStr = (char*) malloc(sizeof(char)* subLen + 1);
            strncpy(subStr, line+i, subLen);
            subStr[subLen]='\0';
            mtx.lock();
            string s(subStr);
            if(m.find(s) != m.end()) m[s]++;
            else {
                  pair<string, int> ret(s, 1);
                  m.insert(ret);
            }
            mtx.unlock();    
        }
    }


    int main(){    

        char **Array = (char **) malloc(sizeof(char *) * num_thread +1); 
        int num = 0;

        while (NOT END OF FILE) {
            if(num < num_th) {
                 if(num == 0) 
                    for(int x = 0; x < num_th; x++) 
                       Array[x] = (char*) malloc(sizeof(char)*strlen(line)+1);
                 strcpy(Array[num], line);
                 num++;
              }
              else {
                 vector<thread> threads;
                 for(int i = 0; i < num_th; i++) {
                    threads.push_back(thread(parseLine, Array[i]);
                 }
                 for(int i = 0; i < num_th; i++){
                    if(threads[i].joinable()) {
                      threads[i].join();
                    }
                 }
                 for(int x = 0; x < num_th; x++) free(seqArray[x]);
                 num = 0;
              }
            } 
    }

1 个答案:

答案 0 :(得分:3)

这是一个神话,只是通过使用线程,最终结果必须更快。通常,为了利用多线程,必须满足两个条件(*):

1)您实际上必须有足够的物理CPU核心,可以同时运行线程。

2)线程有独立的任务要做,他们可以自己完成。

从对所示代码的粗略检查来看,第二部分似乎失败了。在我看来,大多数时候所有这些线程都会相互争斗才能获得相同的互斥锁。在这种情况下,从多线程中获得的收益很少。

(*)当然,出于纯粹的性能原因,您并不总是使用线程。多线程在许多其他情况下也很有用,例如,在具有GUI的程序中,具有单独的线程更新GUI有助于UI工作,即使在主执行线程正在咀嚼某些东西时,... ... / p>