为什么只有启动两个“空”线程时,这段代码才会在*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;
}
答案 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;
}
在这种情况下,无论线程是否存在,它都将起作用。