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]);
}
If Sleep(1000)
call is not present, this code works as expected.
If Sleep(1000)
call is present, the calculate()
function works first time, but second time, it terminates process when the loop around T.push_back
ends.
Why this situation happens?
(Windows7 and microsoft visual studio 2015)