pthread只有在线程数量较少时才可以正常工作
pthread works fine only if the number of threads is small
我正在尝试逐像素加密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 内核一样多的线程 - 这是您可以在硬件中获得的实际并发量的限制。再多一些线程,你只会耗尽资源来支付线程创建和上下文切换的开销。
相反,请创建一个与您拥有的内核数相等的线程池,并将映像分解为块,并将其调度到您创建的线程上。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程