gpt4 book ai didi

c++ - 原子值的部分比较和完全交换

转载 作者:行者123 更新时间:2023-12-01 14:18:18 26 4
gpt4 key购买 nike

问题如下。

给定一个包含两部分的 POD 对象:索引数据。我想对其执行原子条件交换操作,条件是仅检查索引是否相等。

像这样:

struct Data { size_t m_index; char m_data; };
std::atomic<Data> dd; // some initialization
Data zz; // some initialization

// so I want something like this
dd.exchange_if_equals<&Data::m_index>(10,zz);

所以这是一种“部分-compare-and-full-swap”操作。也许这需要对 Data::m_index 进行适当的对齐。

显然 std::atomic 不支持这个,但是可以自己实现这个吗,或者也许有另一个库支持这个?

最佳答案

我认为您必须加载,然后是您的自定义条件,然后是比较和交换,其中比较是当前值完全等于读取值。如果最后一步失败,则循环。

template<class T, class F>
bool swap_if(std::atomic<T>& atomic, T desired, F&& condition) {
for (;;) {
T data = atomic.load();
if (!condition(data)) break;
if (atomic.compare_exchange_weak(data, desired)) return true;
}
return false;
}

http://coliru.stacked-crooked.com/a/a394e336628246a9

由于复杂性,您可能应该只使用互斥锁。另外,std::atomic<Data>Data 以来,可能已经在幕后使用了互斥体。这么大。

关于c++ - 原子值的部分比较和完全交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62052808/

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