我想在beaglebone black上用c ++创建500多个线程 但是程序有错误。 您能解释一下为什么会发生错误以及如何解决错误
在线程函数中。 :call_from_thread(int tid)
void call_from_thread(int tid)
{
cout << "thread running : " << tid << std::endl;
}
在主要功能中。
int main() {
thread t[500];
for(int i=0; i<500; i++) {
t[i] = thread(call_from_thread, i);
usleep(100000);
}
std::cout << "main fun start" << endl;
return 0;
}
我希望
...
...
thread running : 495
thread running : 496
thread running : 497
thread running : 498
thread running : 499
main fun start
但是
...
...
thread running : 374
thread running : 375
thread running : 376
thread running : 377
thread running : 378
terminate called after throwing an instance of 'std::system_error'
what(): Resource temporarily unavailable
Aborted
你能帮我吗?
答案 0 :(得分:4)
beaglebone black似乎具有最大512MB的DRAM。 根据{{3}}的线程的最小堆栈大小。
即2 ^ 29/2 ^ 21 = 2 ^ 8 =256。所以您可能在线程374周围看到的是分配器无法足够快地释放内存来满足需求 通过引发异常来处理。
如果您真的想看到此爆炸,请尝试将睡眠调用移到线程函数中。 :)
您可以尝试将堆栈预分配为1MB或更少(pthreads)pthread_create() is 2MB。
真正要问自己的问题是:
我的应用程序是io绑定还是计算绑定?
运行该应用程序的内存预算是多少?如果您花费了全部物理内存 在线程堆栈上,共享程序堆将一无所有。
我真的需要这么多的并行性来完成这项工作吗? but that has it's own set of problems是单核计算机BTW。
我可以使用线程池解决问题吗?还是根本不使用线程?
最后,您无法在A8中设置堆栈大小。 或者只是为pthreads编写一个瘦包装器(假设使用Linux)。
答案 1 :(得分:0)
每当使用线程时,它都分为三个部分。
您正在启动线程并进行工作,但没有释放它们。
释放线程。有两个释放线程的选项。
在这种情况下,您不希望程序在所有线程执行完毕之前完成,因此您应该加入它们。
#include <iostream>
#include <thread>
#include <vector>
#include <string>
auto call_from_thread = [](int i) {
// I create the entire message before printing it, so that there's no interleaving of messages between threads
std::string message = "Calling from thread " + std::to_string(i) + '\n';
// Because I only call print once, everything gets printed together
std::cout << message;
};
using std::thread;
int main() {
thread t[500];
for(int i=0; i<500; i++) {
// Here, I don't have to start the thread with any delay
t[i] = thread(call_from_thread, i);
}
std::cout << "main fun start\n";
// I join each thread (which waits for them to finish before closing the program)
for(auto& item : t) {
item.join();
}
return 0;
}