我如何在Beaglebone Black上的C ++中创建这么多线程

时间:2019-04-22 08:36:41

标签: c++ multithreading beagleboneblack

我想在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

你能帮我吗?

2 个答案:

答案 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;
}