pthread只有在线程数量较少时才可以正常工作

pthread works fine only if the number of threads is small

本文关键字:常工作 工作 线程 pthread      更新时间:2023-10-16

我正在尝试逐像素加密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;
}

如果图像小至 3*3,则工作正常。

如果图像变大,例如 240*164,程序在打印出"完成...">

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

我不确定是什么让程序在最繁重的部分(加密(完成后冻结。是因为这么多线程已经占用了我所有的内存空间吗?它在运行过程中最大占用超过 10G。


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

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

相反,请创建一个与您拥有的内核数相等的线程池,并将映像分解为块,并将其调度到您创建的线程上。