【问题标题】:Thread kills process because of Sleep function线程因为睡眠功能而杀死进程
【发布时间】: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


【解决方案1】:

如果我没看错代码,你就是在尝试同时运行 2,500 个线程。

在具有默认设置的 32 位进程上,the maximum number of threads you can possibly run simultaneously is 2,048. 超过此值,就会耗尽虚拟地址空间,导致进程崩溃。

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

【讨论】:

    猜你喜欢
    • 2023-02-01
    • 2023-03-26
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多