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
,则安全是因为这是线程安全的。
答案 0 :(得分:0)
您可以使用以下方法通过使用同步机制来实现所需的功能:确保删除p
并将其设置为nullptr
只能由一个线程在一个线程上完成。给定的时刻:
// multiple threads
// ...
// single thread (critical region)
delete p;
p = nullptr;
// multiple threads
// ...
通过这种方式,另一个线程进行的第二次删除无济于事,因为nullptr
将被传递给delete
。