pthread 只有在线程数很少时才能正常工作

Tai*_*Kai -1 c++ multithreading pthreads

我正在尝试逐个像素地加密 BMP 图像,并且我使用 pthread 并行加密它们。

我的代码有点像这样:

struct arg_struct {
    int arg1;
    int arg2;
    ...
};

void* print_message(void* arguments) {
    struct arg_struct* args = (struct arg_struct*)arguments;

    //Encryption...

    // exit from current thread
    pthread_exit(NULL);
}

void multiThreadExample() {
    cout << "Start..." << endl;
    const int NUMBER_OF_THREADS = 50000; // number of pixels
    pthread_t thread[NUMBER_OF_THREADS];
    arg_struct arg[NUMBER_OF_THREADS];
    for (int i=0;i<NUMBER_OF_THREADS;i++) {
        arg[i].arg1 = i;
        arg[i].arg2 = ... // give values to arguments in arg_struct
        pthread_create(&thread[i], NULL, print_message, static_cast<void*>(&arg[i]));
    }

    for(int i = 0; i < NUMBER_OF_THREADS; i++) {
        pthread_join(thread[i], NULL);
    }

    cout << "Complete..." << endl;

    //streaming results to file using filebuf
}

int main() {

    multiThreadExample();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果图像小到 3*3,它工作正常。

如果图像变大,例如 240*164,程序会在打印出“Complete...”后冻结

几分钟后,它说Segmentation fault (core dumped)。

我不确定是什么让程序在最重要的部分(加密)已经完成后冻结。是不是因为这么多线程已经占用了我所有的内存空间?运行时最多占用10G以上。


实际上,我尝试在没有多线程的情况下执行此操作,但程序仍然冻结。

Ale*_*kiy 9

50000个线程是疯狂的。您很可能会因为内存不足而无法为线程分配堆栈。通常,要通过并行性充分利用 CPU,您只需要与 CPU 内核一样多的线程 - 这是硬件中可以获得的实际并发量的限制。任何更多的线程,您只是在消耗资源用于线程创建和上下文切换的开销。

相反,创建一个与您拥有的内核数量相等的线程池,并将您的映像分成多个块,然后将它们调度到您创建的线程上。

  • @TaihouKai 听起来是时候 a) 添加错误处理了。b) 使用调试器。c) 使用“线程清理器”和“地址清理器”等工具。 (2认同)