如何在多线程c ++ 17程序中交换两个指针?

Dea*_*hen 0 c++ multithreading c++17

我有两个指针:pA和pB.它们指向两个大的哈希映射对象.当pB指向的哈希映射完全更新时,我想交换pB和pA.

在C++ 17中,如何快速交换它们并保证线程安全?原子?我是c ++ 17的新手.

Max*_*kin 7

可以通过以下方式实现2个指针的原子无等待交换:

#include <atomic>
#include <cstdint>
#include <cassert>

template<class T>
class Pointers2 {
    uintptr_t const ab_;
    std::atomic<uintptr_t> a_;

public:
    Pointers2(T* a, T* b)
        : ab_(reinterpret_cast<uintptr_t>(a) ^ reinterpret_cast<uintptr_t>(b))
        , a_(reinterpret_cast<uintptr_t>(a))
    {}

    T* a() const { return reinterpret_cast<T*>(a_.load(std::memory_order_acquire)); }
    T* b() const { return reinterpret_cast<T*>(a_.load(std::memory_order_acquire) ^ ab_); }
    void exchange() { a_.fetch_xor(ab_, std::memory_order_release); }
};

int main() {
    int a = 1, b = 2;
    Pointers2<int> p2(&a, &b);
    assert(p2.a() == &a);
    assert(p2.b() == &b);
    p2.exchange();
    assert(p2.a() == &b);
    assert(p2.b() == &a);
    p2.exchange();
    assert(p2.a() == &a);
    assert(p2.b() == &b);
}
Run Code Online (Sandbox Code Playgroud)

需要获取/释放内存排序以确保对共享数据的写入T不会重新排序exchange.