gpt4 book ai didi

c++ - POD 类型的原子位操作

转载 作者:太空狗 更新时间:2023-10-29 21:34:55 24 4
gpt4 key购买 nike

鉴于以下情况:

#include<atomic>

struct Foo
{
uint64_t data[1];
};

std::atomic<Foo> bar;

void DoAtomicOr(uint64_t value)
{
std::atomic_fetch_or(&bar, value);
}

我的编译器提示第一个参数的类型无法传递到提取中,因为它的类型不匹配任何已知的重载。我可以将其类型转换为:

std::atomic_fetch_or((std::atomic<uint64_t> *)&bar, value);

但这很容易出错,因为我今天早些时候已经向自己证明了这一点。有没有更好的方法让编译器意识到他的 Pod 类型 Foo 在这里实际上只是一个美化的 uint64_t

最佳答案

Foo 不是 integral 类型,因此您不能使用 fetch_or()

一种解决方案是使用 data[1](而不是 Foo)作为 atomic 类型:

struct Foo
{
std::atomic<uint64_t> data[1];
};

Foo bar;

void DoAtomicOr(uint64_t value)
{
std::atomic_fetch_or(&bar.data[0], value);
}

如果你想保持 Foo atomic,你可以使用带有 OR 操作的比较和交换:

struct Foo
{
uint64_t data[1];
};

std::atomic<Foo> bar;

void DoAtomicOr(uint64_t value)
{
Foo expected = bar.load();
Foo desired;

do {
desired = expected;

desired.data[0] |= value;

} while (!std::atomic_compare_exchange_weak(&bar, &expected, desired));
}

关于c++ - POD 类型的原子位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44707693/

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