C ++删除对象,它会锁定吗?

C++ deleting object, does it lock?

使用 C++,当我创建一个新对象时,'new' 关键字会进行一些锁定(因为它进行一些内存分配等)。所以,我不能直接在无锁软件中使用它。

但是,'delete' 关键字会创建任何类型的锁吗?

我仍在使用 C++98,我认为它在 C++11 中的工作方式相同;

C++98 标准没有多线程的概念。实现线程安全与实现的纬度有关。此外,该标准仅指示程序 应如何表现

例如,有一些可用的实现在调用 delete 时实际上不会释放内存给 OS。

话虽如此,C++98 的答案是它可能不会锁定。但它是独立于实现的。

在 C++11 中,情况完全不同,因为该标准引入了多线程的概念。

如您所说,new 中锁定的原因是内存分配。如果分配需要锁,则很有可能,至少在某些情况下,相应的 de-allocation 也需要锁。 de-allocation 当然有可能是无锁的,即使分配需要锁。

请注意 delete 本身不进行锁定(new 也不进行),它是底层原语进行的。所以如果你有一个 lock-less 分配器,那么使用 newdelete 应该没有问题。 [当然假设构造函数和析构函数是lock-less。

请注意,放置形式 newdelete 不应锁定。

避免 newdelete(或至少分配)可能还会限制您可以做的大量事情。除了 std::array(在 C++11 中)之外的所有容器都将执行分配,例如,所以没有 std::vectorstd::stringstd::map 等。许多构造函数执行分配创建的对象。当然,除了 newdelete 之外的其他函数可能有锁 - I/O 函数通常有锁以防止完全乱码输出(但不一定保证整个输出不被乱码, 任何一个)。几乎任何使用公共共享资源的东西都可能在某个级别上有锁,无论是在 OS 内部还是在 user-mode 级别。

C++ 标准在这方面并没有真正说明什么,它是一个实现细节。