私はファイルを1行ずつ読み込んで長さ50の可能な部分文字列をその頻度とともにハッシュテーブルに格納するプログラムを持っています。プログラムでスレッドを使用して、5行を読み込み、5つの異なるスレッドを使用して処理を実行しようとしました。処理には、その行の各部分文字列を読み取って、それらを周波数のハッシュマップに入れます。しかし、私はプログラムがシリアル・アプローチより高速ではないことが分からなかった何かが間違っているようです。また、大きな入力ファイルに対しては中止されます。ここで私はそれだけでスレッドを使用してのおかげで、最終結果が速くなければなりません神話だC++でのスレッドプログラムが遅くない
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;
}
}
}
ターゲットマシンで実際にいくつのコアをアドレス指定できますか? –
ようこそStackOverflowへ。ガイドラインを読んで[MCVE]を投稿してください。 – davmac
1つ目は、おそらくスレッドを作成する作業ではないと思われます。第2に、すべてのスレッドが1つのスレッドのみを実行するのを待っているmutex mtxが1つあります。時間。 – Soren