- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 http://en.cppreference.com/w/cpp/atomic/atomic_compare_exchange , 以下示例代码作为 std::atomic_compare_exchange_weak
的示例使用:
void append(list* s, node* n)
{
node* head;
do {
head = s->head;
n->next = head;
} while(! std::atomic_compare_exchange_weak(s->head, head, n));
}
我的理解是这个有比较*(s->head)
的效果与 head
, 当我认为需要的是比较 s->head
与 head
.第一个参数应该是 std::atomic_compare_exchange_weak
在这个例子中是 &(s->head)
,还是我遗漏了什么?
更新:std::atomic_compare_exchange_weak
的规范说:
bool atomic_compare_exchange_weak(volatile A* object, C * expected, C desired) noexcept;
bool atomic_compare_exchange_weak(A* object, C * expected, C desired) noexcept;
Effects: Atomically, compares the contents of the memory pointed to by object...for equality with that in expected...
我认为这意味着 *object
与 expected
进行了比较,但进一步的研究表明,实际含义是 *object
与 *expected
进行比较(即,“在 expected
中”表示“由 expected
指向”)。这意味着我最初问题的答案是“不,没有必要在 cppreference 的示例代码中获取 s->head
的地址”。但事实是 object
必须指向 std::atomic<T>
预期必须指向 T
让我很难弄清楚如何更正 cppreference 中的代码以便它可以编译。我们想将列表的头部与列表头部的拷贝进行比较,但如果列表头部的类型为 std::atomic<T>*
, 拷贝必须是 T*
类型如果调用std::atomic_compare_exchange_weak
是编译,我找不到分配 std::atomic<T>*
的方法到 T*
没有 reinterpret_cast
.即便如此,第三个参数为std::atomic_compare_exchange_weak
需要是类型 T
,但 cppreference 中的示例显示第二个和第三个参数属于同一类型。这向我表明 cppreference 的示例已损坏。我试图修复它,但由于需要使用 reinterpret_cast
而受阻。感觉不对。
有趣的是,在我尝试解决这些问题时,我检查了 msdn page for std::atomic_compare_exchange_weak
, 我很沮丧地看到该页面显示了 std::atomic_compare_exchange_*strong*
的原型(prototype)!
有人可以发布使用 std::atomic_compare_exchange_weak
的合理代码吗?在单链表的前面插入一个节点?无需担心 ABA 问题或做任何花哨的事情。我只想查看可编译的框架代码。
最佳答案
一个正确的例子是:
struct list {
std::atomic<node*> head;
};
...
void append(list* s, node* n)
{
node* head;
do {
head = s->head;
n->next = head;
} while (!std::atomic_compare_exchange_weak(&(s->head), &head, n));
// or while (!s->head.compare_exchange_weak(head, n));
}
list::head
需要是 std::atomic
对象,除非你想处理未定义的行为。有问题的平台可能需要部分或全部 std::atomic
使用锁来实现的东西。因此,std::atomic<T*>
可能包括其他成员和 reinterpret_cast<std::atomic<T*>*>
UB 意味着您的程序崩溃了。
关于c++ - cppreference 中 atomic_compare_exchange_weak 的示例代码是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16026740/
它是在 cppreference atomic_compare_exchange Talk page 上提出的std::atomic_compare_exchange_weak 的现有实现 使用非原子
在 http://en.cppreference.com/w/cpp/atomic/atomic_compare_exchange , 以下示例代码作为 std::atomic_compare_exc
我是一名优秀的程序员,十分优秀!