启动线程在指针初始化时导致分段错误

时间:2019-07-19 13:34:59

标签: c++ multithreading pointers segmentation-fault

为什么只有启动两个“空”线程时,这段代码才会在*y = 20上引起分段错误?

int main(int argc, char **argv) {

    int x = 10;
    int *y;
    *y = 20;

    std::thread t1([]{});
    std::thread t2([]{});

    t1.join();
    t2.join();

    return 0;
}

1 个答案:

答案 0 :(得分:6)

取消引用未初始化(或null)的指针是未定义的行为。 在这种情况下,所发生的一切取决于编译器。

您可能打算做类似的事情:

int main(int argc, char **argv) {

    int x = 10;
    int *y = &x;
    *y = 20;

    std::thread t1([]{});
    std::thread t2([]{});

    t1.join();
    t2.join();

    return 0;
}

在这种情况下,无论线程是否存在,它都将起作用。