删除线程安全吗?

时间:2019-01-22 08:50:19

标签: c++ multithreading thread-safety new-operator delete-operator

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

我知道使p等于nullptr是一个好习惯,但是现在我只想知道delete是否是线程安全的?在上述情况下,我需要使用锁吗?

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

这是因为我发现在同一线程中两次delete p会导致核心转储错误,而在两个线程中两次delete p不会发生任何错误。

我知道double delete是一个UB,所以我想知道delete是否是线程安全的,这意味着如果我们同时输入两次函数delete,则安全是因为这是线程安全的。

1 个答案:

答案 0 :(得分:0)

您可以使用以下方法通过使用同步机制来实现所需的功能:确保删除p并将其设置为nullptr只能由一个线程在一个线程上完成。给定的时刻:

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

通过这种方式,另一个线程进行的第二次删除无济于事,因为nullptr将被传递给delete