我有一个程序,它逐行读取文件,然后将每个可能的长度为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;
}
}
}
答案 0 :(得分:3)
这是一个神话,只是通过使用线程,最终结果必须更快。通常,为了利用多线程,必须满足两个条件(*):
1)您实际上必须有足够的物理CPU核心,可以同时运行线程。
2)线程有独立的任务要做,他们可以自己完成。
从对所示代码的粗略检查来看,第二部分似乎失败了。在我看来,大多数时候所有这些线程都会相互争斗才能获得相同的互斥锁。在这种情况下,从多线程中获得的收益很少。
(*)当然,出于纯粹的性能原因,您并不总是使用线程。多线程在许多其他情况下也很有用,例如,在具有GUI的程序中,具有单独的线程更新GUI有助于UI工作,即使在主执行线程正在咀嚼某些东西时,... ... / p>