我正在学习在一个简单的keygen示例中使用多线程。 我已经实现了匹配algorhythm的hashkeys,它会增加其中一个键并将其与原始键进行比较,并且一旦两个hashkey匹配就应该停止。所以我需要迭代0xffffffffff不同的hashkeys来找到匹配。 我已经阅读了关于该主题的一些msdn,并决定从thread_number_offset开始循环并使用number_of_threads递增每次迭代,从而启动相同匹配的8个线程。 这是入门代码:
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的全部功能。 为什么会这样?它比我做的要复杂得多吗?
答案 0 :(得分:0)
好的,我在禁用之后就得到了这种结构,我有100%的CPU使用率:
WaitForSingleObject(mutex, INFINITE);
std::cout << buffer;
ReleaseMutex(mutex);
其中buffer是char缓冲区[256] 所以这是我将要挖掘的某种同步问题