2014-11-01 42 views
1

编辑:多线程在C++抛出线程构造失败:资源暂时不可用

我正在学习用矩阵乘法多线程作为一个例子,我创造了这个计划:

#include <iostream> 
#include <vector> 
#include <thread> 
#include <functional> 

using namespace std; 

int N = 50; 
void do_multiply_for_row(const vector<vector<int> >& matrix, int i, int N, vector<int>& answer) { 
    for (int j = 0; j < N; j++) { 
     answer[j] = 0; 
     for (int k = 0; k < N; k++) { 
      answer[j] += matrix[i][k] * matrix[k][j]; 
     } 
    } 
    cout << "Done " << i << endl; 
} 

int main() { 
    vector<vector<int> > matrix(N, vector<int> (N, 0)); 
    int x = 0; 
    for (int i = 0; i < N; i++) { 
     for (int j = 0; j < N; j++) { 
      matrix[i][j] = x++; 
     } 
    } 
    vector<vector<int> > result(N, vector<int> (N, 0)); 
    vector<std::thread> threads; 
    for (int i = 0; i < N; i++) { 
      threads.push_back(std::thread(std::bind(do_multiply_for_row, std::cref(matrix), i, N, std::ref(result[i])))); 
    } 
    for (int i = 0; i < threads.size(); i++) threads[i].join(); 
    for (int i = 0; i < N; i++) { 
     for (int j =0; j < N; j++){ 
      cout << result[i][j] << " "; 
     } 
     cout << endl; 
    } 
    return 0; 
} 

我将最终创建50个线程,但得到libc++abi.dylib: terminating with uncaught exception of type std::__1::system_error: thread constructor failed: Resource temporarily unavailable

是否有限制我创建的线程数或我做错了什么?

+0

NVM,我是一个小丑,一次又一次为同一行创建线程。 – user1159517 2014-11-01 18:07:13

+1

您可以创建的线程数量有限制,最终取决于您的系统。 – 0x499602D2 2014-11-01 18:09:54

+0

没关系。我比较单线程矩阵乘法和多线程矩阵乘法的结果,以及单线程总是赢的结果! – user1159517 2014-11-01 18:10:53

回答

3

线程实现与系统有关,线程数量的限制也是如此。

你的错误信息表明:“resource_unavailable_try_again - 系统缺乏必要的资源来创建另一个线程,或在线程数的系统强加的限制的过程会超出。”(标准C++ ,30.3.1.2/8):

还有就是多线程效率,这是thread::hardware_concurrency()限制。这个值是由硬件支持的线程数的近似值(但功能如果哈不知道可能会返回0):

  • 你当然可以创建多个线程,但你的操作系统都必须切换让它们运行的​​上下文(即搁置一些正在运行的线程以给予等待执行的机会)。这意味着某些线程不会同时运行。

  • 如果您运行的线程数少于thread::hardware_concurrency(),则无法确定实际上是否使用并发:除您以外的其他进程也可能使用某些可用容量。

这个观点的两个提示。首先,您可以在线程中插入this_thread::yield();,特别是如果它们有重圈。如果所有的硬件线程都很忙,那么这个机会就会被调度到其他线程中。其次,您可以考虑thread pools:创建固定数量的线程,每次完成计算时都会从队列中选择任务。