我正在使用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;
};