我正在学习在一个简单的 keygen 示例中使用多线程。我已经实现了哈希键匹配算法,它增加了一个键并将其与原始键进行比较,一旦两个哈希键匹配,它就应该停止。所以我需要遍历 0xffffffffff 不同的哈希键来找到匹配项。我已经阅读了一些关于该主题的 msdn,并决定启动 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。为什么会这样?它比我做的复杂得多吗?