我应该为旋转锁定内存添加障碍吗?

时间:2017-03-02 09:11:21

标签: c++ memory-barriers spinlock

我正在使用spin lock来实现并发队列。

AFAIK,当线程1更改线程共享内存时,线程2可能看不到此修改。它被称为内存可见性。

当我使用互斥锁时,它可以确保其他线程的内存可见性。但在旋转锁定情况下,它是否会像互斥锁一样起作用?

这是测试代码:

class Spin
{
public:
    void lock() {
        while (locked.test_and_set(std::memory_order_acquire));
    }
    void unlock() {
        locked.clear(std::memory_order_release);
    }
protected:
    std::atomic_flag locked = ATOMIC_FLAG_INIT ;
};

template <typename T>
class ConcurrentQueue
{
public:
    void push(const T& value) {
        m_spin.lock();
        m_queue.push(value);
        m_spin.unlock();
    }
    T pop() {
        m_spin.lock();
        T value = m_queue.front();
        m_queue.pop();
        m_spin.unlock();
        return value;
    }
protected:
    std::queue<T> m_queue;//Should I change it to std::queue<std::atomic<T>> or other memory synchronous
    Spin m_spin;
};

0 个答案:

没有答案