2014-11-01 132 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:創建固定數量的線程,每次完成計算時都會從隊列中選擇任務。