C ++删除对象,是否锁定?

时间:2018-04-02 06:30:00

标签: c++ thread-safety lock-free

使用C ++,当我创建一个新对象时,然后是' new'关键字做一些锁(因为它做了一些内存分配等)。所以,我无法在无锁软件中直接使用它。

然而,'删除'关键字创建任何类型的锁?

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

2 个答案:

答案 0 :(得分:2)

正如你所说,锁定new的原因是内存分配。如果分配需要锁定,则至少在某些情况下,很可能相应的解除分配也需要锁定。当然,即使分配需要锁定,解除分配也是无锁的。

请注意delete本身不会执行锁定(new也不执行),它是基础原语。因此,如果您有一个无锁分配器,那么使用newdelete应该没有问题。 [假设构造函数和析构函数是无锁的,当然]。

请注意,展示位置表单newdelete不应该锁定。

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

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

答案 1 :(得分:1)

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

例如,有些实现可以在调用delete时实际向操作系统释放内存。

这就是说,C ++ 98的答案是它可能无法锁定。但它是独立于实现的。

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

相关问题