-1

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

4

1 回答 1

0

好的,在禁用它后我得到了这种构造,我得到了 100% 的 CPU 使用率:

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

其中缓冲区是一个字符缓冲区[256] 所以这是我接下来要研究的某种同步问题

于 2015-07-20T11:03:48.093 回答