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

Ant*_*oro -4 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;
}
Run Code Online (Sandbox Code Playgroud)

Tur*_*ght 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;
}
Run Code Online (Sandbox Code Playgroud)

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