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)
答案 0 :(得分:0)
如果我正确阅读了代码,您就会尝试同时运行2,500个帖子。
在具有默认设置的32位进程中,the maximum number of threads you can possibly run simultaneously is 2,048.超过此范围,并且您的虚拟地址空间不足,导致进程崩溃。
但即使你搞砸了设置或重新编译为64位,这也不是一个明智的做法;它会表现得非常糟糕。相反,使用工作队列或其他一些技术将工作分配给较少数量的线程;如果每个CPU核心都有一个线程,通常可以获得最佳性能。