探究SpinLock锁结构体变量能干啥。
结论,就是得拿到这个变量,才能运行接下来的代码,不过我还不明白为啥这么运行出的结果,头大死了
探究SpinLock锁结构体变量能干啥。
#include <iostream>
#include <atomic>
#include <thread>
#include <chrono>
// 自旋锁
struct SpinLock
{
SpinLock(std::atomic_flag &flag) : m_flag(flag)
{
while (m_flag.test_and_set(std::memory_order_acquire));
}
~SpinLock()
{
m_flag.clear(std::memory_order_release);
}
private:
std::atomic_flag &m_flag;
};
class RingBuffer
{
public:
struct alignas(64) Item
{
Item()
: flag{ ATOMIC_FLAG_INIT }
, written(0) {}
std::atomic_flag flag;
char written;
};
void push()
{
unsigned int write_index = 1;
Item item;
SpinLock spinlock(item.flag); // 主线程往下执行,12线程堵塞 第0秒。 第四秒时,主线程释放锁,
item.written = 1; //标志位,1代表有东西已经写入了
std::this_thread::sleep_for(std::chrono::seconds(4));
printThreadId();
}
void printThreadId() {
std::thread::id threadId = std::this_thread::get_id();
std::cout << "Thread ID: " << threadId << std::endl;
}
};
int main()
{
RingBuffer rb;
rb.push();
std::thread t1([&rb]() { rb.push(); });
std::thread t2([&rb]() { rb.push(); });
t1.join();
t2.join();
return 0;
}
结果:Thread ID: 0xf4
Thread ID: Thread ID: 0xf8
0xfc
第一个是主进程第四秒时打印, 0xf4, 第二个第三个是从线程,打印顺序乱了是因为都在第8s同时打印