今天写代码遇到一个很奇怪的问题,多线程共享变量,卡在一个不应该卡的地方,后来发现是共享的变量值没有更新。解决的办法有两个:
1. 加volatile 关键字修饰
2. 刷新内存屏障读指令
内存屏障相关的代码如下:
#ifndef Linux
#include <windows.h>
#include <winnt.h>
#endif // !Linux
#ifdef Linux
#define smp_rmb() asm volatile("lfence":::"memory")
#define smp_mb() asm volatile("mfence":::"memory")
#define smp_wmb() asm volatile("sfence" ::: "memory")
#else
#define smp_rmb() MemoryBarrier() // win版本内存屏障 https://learn.microsoft.com/zh-cn/windows/win32/api/winnt/nf-winnt-memorybarrier
#define smp_mb() MemoryBarrier()
#define smp_wmb() MemoryBarrier()
#endif