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