【发布时间】:2016-08-20 00:17:44
【问题描述】:
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)
【问题讨论】:
-
您的问题不清楚。请更准确地了解哪些线程运行、何时运行、它们在什么条件下终止以及如何终止。
-
还要解释一下“sum”是什么,因为您似乎可以同时访问这个变量。
-
无法复制Demo。
-
我编辑代码。如果 A = [5 * 5] 的大小,则此代码可以很好地激活,但 A = [50 * 50] 不能很好地激活。
-
看maximum-number-of-threads-per-process-in-linux,因为
50*50线程是2500线程(而没有睡眠,线程有时间完成)。
标签: c++ windows multithreading c++11