删除线程安全吗?
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
的内容。
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
的内容。