我正在尝试创建一个自旋锁的哑版.浏览网页时,我在x86中遇到了一个名为"PAUSE"的汇编指令,该指令用于向处理器提供当前在此CPU上运行自旋锁的提示.英特尔手册和其他可用信息说明了这一点
在大多数情况下,处理器使用此提示来避免内存顺序违规,从而大大提高了处理器性能.因此,建议在所有自旋等待循环中放置PAUSE指令.文档还提到"等待(一些延迟)"是指令的伪实现.
上段的最后一行很直观.如果我没有成功抓住锁,我必须等待一段时间然后再抓住锁.
但是,在旋转锁定的情况下,内存顺序违规是什么意思?"内存顺序违规"是否意味着旋转锁定后指令的错误推测加载/存储?
关于堆栈溢出之前已经询问了自旋锁定问题但是内存顺序违规问题仍未得到解决(至少对于我的理解).
编写x86暂停指令的跨平台实现的最佳实践是什么?我打算在C++ 11项目的繁忙旋转循环中使用它.
如果我只使用gcc工具链,那么我可以使用_mm_pause内在函数.即使本机处理器不支持x86暂停指令,这种内在功能是否正确?我也希望我的代码也能用于clang/llvm工具链.
我认为回退可以使用"std :: this_thread :: sleep_for",因为我使用的是C++ 11.但我不确定如何检测处理器功能(支持暂停与不支持)并重新进入休眠状态.
我正在使用cmake来构建我的项目,并且也将始终在同一台机器上构建和部署.所以我很乐意在编译期间检测处理器设置.
示例实现(伪代码)是:
void pause() {
// Not sure how to detect if pause is available on the platform.
#if defined(USE_mm_pause)
__asm__ ( "pause;" );
#else
std::this_thread::sleep_for(std::chrono::seconds(0));
#endif
}
Run Code Online (Sandbox Code Playgroud)