gpt4 book ai didi

c++ - cppreference 中 atomic_compare_exchange_weak 的示例代码是否正确?

转载 作者:可可西里 更新时间:2023-11-01 17:58:44 26 4
gpt4 key购买 nike

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->headhead .第一个参数应该是 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...

我认为这意味着 *objectexpected 进行了比较,但进一步的研究表明,实际含义是 *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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com