删除线程安全吗?

Is delete thread-safe?

int *p = new int;
// delete p in thread 1
// delete p in thread 2

我知道让 p 等于 nullptr 是一个很好的行为,但现在我只想知道 delete 是否线程安全?上面的情况需要加锁吗?

是的,我删除了同一个对象两次。

这是因为我发现在同一个线程中两次delete p会报core dumped错误,而在两个线程中两次delete p不会报错。

我知道double delete是一个UB所以我想知道delete是不是线程安全的,也就是说如果我们同时进入函数delete两次,我们是安全的因为它是线程安全的。

您可以使用以下方法通过使用同步机制来实现您想要的:确保 p 的删除和设置为 nullptr 只能由单个线程完成在特定时刻:

// multiple threads
// ...
// single thread (critical region)
delete p;
p = nullptr;
// multiple threads
// ...

这样,另一个线程的第二次删除不会执行任何操作,因为 nullptr 将是要传递给 delete 的内容。