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以上。
实际上,我尝试在没有多线程的情况下执行此操作,但程序仍然冻结。
50000个线程是疯狂的。您很可能会因为内存不足而无法为线程分配堆栈。通常,要通过并行性充分利用 CPU,您只需要与 CPU 内核一样多的线程 - 这是硬件中可以获得的实际并发量的限制。任何更多的线程,您只是在消耗资源用于线程创建和上下文切换的开销。
相反,创建一个与您拥有的内核数量相等的线程池,并将您的映像分成多个块,然后将它们调度到您创建的线程上。
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |