C++ 11中有两个原子CAS操作:atomic_compare_exchange_weak
和atomic_compare_exchange_strong
.
根据cppreference:
允许函数的弱形式虚假地失败,即,即使它们是相等的,也可以表现为*obj!=*.当比较和交换处于循环中时,弱版本将在某些平台上产生更好的性能.当一个弱的比较和交换需要一个循环而一个强大的那个不需要时,强者更可取.
以下是使用弱版本的示例,我认为:
do {
expected = current.value();
desired = f(expected);
} while (!current.atomic_compare_exchange_weak(expected, desired));
Run Code Online (Sandbox Code Playgroud)
有人可以给出比较和交换不在循环中的示例,以便强版本更可取吗?
在"内部C++对象模型"一书的第6.3节中,临时对象(第230页):
实际结果取决于实现依赖于底层删除操作符实际释放所寻址的内存的积极程度.某些实现虽然将内存标记为空闲,但实际上并未以任何方式对其进行更改.在内存被其他内容声明之前,可以使用它,就像它没有被删除一样.虽然显然不是软件工程的示例性方法,但是在释放它之后访问内存的这种习惯并不罕见. 事实上,许多实现
malloc()
提供了一种特殊的调用malloc(0);
来保证这种行为.
根据以上所述,malloc(0)
似乎与访问已经被释放的存储器(但其内容未被改变)有关.
我的问题是如何malloc(0)
保证这种行为?
根据7.3.1.2 C++标准ISO/IEC 14882:2003(E)中的命名空间成员定义
首先在名称空间中声明的每个名称都是该名称空间的成员.如果非本地类中的友元声明首先声明一个类或函数(这意味着该类或函数的名称是不合格的),那么友元类或函数是最内层封闭命名空间的成员.
// Assume f and g have not yet been defined.
void h(int);
template <class T> void f2(T);
namespace A {
class X {
friend void f(X); // A::f(X) is a friend
class Y {
friend void g(); // A::g is a friend
friend void h(int); // A::h is a friend
// ::h not considered
friend void f2<>(int); // ::f2<>(int) is a friend
};
};
// A::f, A::g and A::h are not visible here
X x;
void …
Run Code Online (Sandbox Code Playgroud)