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 分配器,那么使用 new
和 delete
应该没有问题。 [当然假设构造函数和析构函数是lock-less。
请注意,放置形式 new
和 delete
不应锁定。
避免 new
和 delete
(或至少分配)可能还会限制您可以做的大量事情。除了 std::array
(在 C++11 中)之外的所有容器都将执行分配,例如,所以没有 std::vector
、std::string
、std::map
等。许多构造函数执行分配创建的对象。当然,除了 new
和 delete
之外的其他函数可能有锁 - I/O 函数通常有锁以防止完全乱码输出(但不一定保证整个输出不被乱码, 任何一个)。几乎任何使用公共共享资源的东西都可能在某个级别上有锁,无论是在 OS 内部还是在 user-mode 级别。
C++ 标准在这方面并没有真正说明什么,它是一个实现细节。
使用 C++,当我创建一个新对象时,'new' 关键字会进行一些锁定(因为它进行一些内存分配等)。所以,我不能直接在无锁软件中使用它。
但是,'delete' 关键字会创建任何类型的锁吗?
我仍在使用 C++98,我认为它在 C++11 中的工作方式相同;
C++98 标准没有多线程的概念。实现线程安全与实现的纬度有关。此外,该标准仅指示程序 应如何表现。
例如,有一些可用的实现在调用 delete
时实际上不会释放内存给 OS。
话虽如此,C++98 的答案是它可能不会锁定。但它是独立于实现的。
在 C++11 中,情况完全不同,因为该标准引入了多线程的概念。
如您所说,new
中锁定的原因是内存分配。如果分配需要锁,则很有可能,至少在某些情况下,相应的 de-allocation 也需要锁。 de-allocation 当然有可能是无锁的,即使分配需要锁。
请注意 delete
本身不进行锁定(new
也不进行),它是底层原语进行的。所以如果你有一个 lock-less 分配器,那么使用 new
和 delete
应该没有问题。 [当然假设构造函数和析构函数是lock-less。
请注意,放置形式 new
和 delete
不应锁定。
避免 new
和 delete
(或至少分配)可能还会限制您可以做的大量事情。除了 std::array
(在 C++11 中)之外的所有容器都将执行分配,例如,所以没有 std::vector
、std::string
、std::map
等。许多构造函数执行分配创建的对象。当然,除了 new
和 delete
之外的其他函数可能有锁 - I/O 函数通常有锁以防止完全乱码输出(但不一定保证整个输出不被乱码, 任何一个)。几乎任何使用公共共享资源的东西都可能在某个级别上有锁,无论是在 OS 内部还是在 user-mode 级别。
C++ 标准在这方面并没有真正说明什么,它是一个实现细节。