2016-04-26 75 views
1
thread_local int sum = 0; 
void thrCal(int row, int column, int n, int &result, const vector<vector<int>> &A, const vector<vector<int>> &B) 
{ 
    Sleep(1000); 
    for (int i = 0; i < n; i++) 
     sum += A[row][i] * B[i][column]; 
    result = sum; 
} //calculates each element with thread 

void calculate(vector<vector<int>> &A, const vector<vector<int>> &B) 
{ 
    vector<vector<int>> temp; 
    vector<thread> T; 
    int row = A.size(), column = B[0].size(), n = A[0].size(); 

    cout << "check print" << endl; 

    temp.resize(row); 
    for(auto &i : temp) 
     i.resize(column); 

    for (int i = 0; i < row; i++) 
     for (int j = 0; j < column; j++) 
      T.push_back(thread(thrCal, i, j, n, ref(temp[i][j]), ref(A), ref(B))); 

    for (auto &i : T) 
     i.join(); 

    A = move(temp); 
} //matrix A = A * B with multithread 

int main() 
{ 
    vector<vector<int>> *A = new vector<vector<int>>[3]; 
    vector<vector<int>> result; 

    A[0].resize(50); 
    A[1].resize(50); 
    A[2].resize(50); 
    for (int i = 0; i < 3; i++) 
     for (auto &j : A[i]) 
      j.resize(50); 

    result = A[0]; 
    for (int i = 1; i < 3; i++) 
     calculate(result, A[i]); 

} 

如果Sleep(1000)呼叫目前,该代码按预期工作。线程杀死进程,因为休眠功能的

如果Sleep(1000)呼叫存在,calculate()功能第一次工作,但第二次,当T.push_back周围的循环结束时它终止过程。

为什么会出现这种情况?

(Windows7中和Microsoft Visual Studio 2015年)

+2

你的问题不清楚。请更准确地说明什么线程运行,什么时候运行,以及它们终止的条件和方式。 – jotik

+0

也解释了什么是“总和”,因为你似乎并发访问这个变量。 –

+0

无法重现[Demo](http://coliru.stacked-crooked.com/a/8af64aa66d694172)。 – Jarod42

回答

0

如果我正确地阅读代码,你试图同时运行2500个线程。

在带默认设置的32位进程中,the maximum number of threads you can possibly run simultaneously is 2,048.不止于此,并且用尽了虚拟地址空间,导致进程崩溃。

但即使您将设置搞乱或重新编译为64位,这也不是一个明智的做法;它会表现得很差。相反,使用工作队列或其他技术将工作分配到更少的线程;如果每个CPU内核都有一个线程,则通常会获得最佳性能。