単純なキー生成の例でマルチスレッドを使用する方法を学んでいます。キーの 1 つをインクリメントして元のキーと比較するハッシュキー マッチング アルゴリズムを実装しました。2 つのハッシュキーが一致すると停止します。したがって、0xffffffffff の異なるハッシュキーを反復処理して一致を見つける必要があります。このトピックに関するいくつかの msdn を読み、同じ一致する for ループの 8 つのスレッドを、thread_number_offset で開始し、各反復を number_of_threads ずつインクリメントして開始することにしました。スターターコードは次のとおりです。
struct Args{
Args(char* in_CT, Chunk* in_chunk, int in_thread_id, int in_stride) :
stride{in_stride},
input_CT{ in_CT },
chunk{ in_chunk },
thread_id{ in_thread_id }{}
Chunk* chunk;
char* input_CT;
int thread_id;
int stride;
};
void Match(void *args){
Args *a = (Args*)args;
a->chunk->MatchCTMP(a->input_CT,a->thread_id,a->stride);
}
for (unsigned int i = 0; i < threads_num; ++i){
CTTable[i] = new char[0x100];
ArgsTable[i] = new Args(CTTable[i], &in_chunk, i, threads_num);
_beginthread(ThreadFunc, 0, ArgsTable[i]);
}
forループを使用した関数は次のとおりです。
void Chunk::MatchCTMP(char* in_dest_CT,int in_thread_id, int in_stride){
unsigned int i = in_thread_id;
unsigned int i_end = MAX - i;
for (; i < i_end; i += in_stride){
hash[0] = i & 0xff;
...
...HashFunction(in_dest_CT);//CT is Compare Table
...CompareFunction(in_dest_CT, in_source_CT);
}
}
すべて問題ありませんが、タスク マネージャー ウィンドウの CPU 負荷は 10 ~ 15% を超えません。また、すべてのコアが実際にロードされるわけではありません。コア 0、2、4、6 はビジーですが、1、3、5、7 はビジーです。CPUコアの最大数で一定の反復を行うと、CPUがすぐにフル機能でロードされるはずだと思いました。なぜそれが起こっているのですか?私がやったことよりもはるかに複雑ですか?