线程因睡眠功能而导致死亡

时间:2016-04-26 09:10:01

标签: c++ windows multithreading c++11

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)

1 个答案:

答案 0 :(得分:0)

如果我正确阅读了代码,您就会尝试同时运行2,500个帖子。

在具有默认设置的32位进程中,the maximum number of threads you can possibly run simultaneously is 2,048.超过此范围,并且您的虚拟地址空间不足,导致进程崩溃。

但即使你搞砸了设置或重新编译为64位,这也不是一个明智的做法;它会表现得非常糟糕。相反,使用工作队列或其他一些技术将工作分配给较少数量的线程;如果每个CPU核心都有一个线程,通常可以获得最佳性能。