在8核CPU上启动8个线程并不会产生100%的CPU负载

时间:2015-07-19 10:38:15

标签: c++ multithreading winapi cpu-usage beginthread

我正在学习在一个简单的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的全部功能。 为什么会这样?它比我做的要复杂得多吗?

1 个答案:

答案 0 :(得分:0)

好的,我在禁用之后就得到了这种结构,我有100%的CPU使用率:

WaitForSingleObject(mutex, INFINITE);
std::cout << buffer;
ReleaseMutex(mutex);

其中buffer是char缓冲区[256] 所以这是我将要挖掘的某种同步问题