【发布时间】:2015-03-24 11:52:11
【问题描述】:
对于我对在 Windows x64 上使用原子互锁操作不感兴趣的类型,是否可以哄骗 std::atomic 输出 CMPXCHG16B,或者我只需要吸干它并手动执行原子操作?我可以让 GCC/Clang 在 Linux 上执行此操作,所以我怀疑这只是 Microsoft 标准库的问题。
struct Byte16
{
int64_t a, b;
};
std::atomic<Byte16> atm;
Byte16 a = { 1, 2 };
atm.compare_exchange_strong(...); // This has a lock on Windows, not on Linux version of code
【问题讨论】:
-
处理器兼容性?一些较旧的 CPU 没有该指令:也许您需要针对更窄的目标进行编译?
-
@Yakk 我已经考虑过了,但是我无法确定要传递到 ICC 的标志。 .
-
试过these options?从最“强大”的开始,看看它是否能解决你的问题?我只是在这里猜测和搜索。
-
看起来确实是微软标准库的问题。通过标头,只有最多 8 字节原子的特化。
-
对于未来的读者,here's pure C++
std::atomic<struct>code that compiles tolock cmpxchg16b与 gcc 或 clang 与-mcx16以启用该指令的使用(不幸的是,这不是 x86-64 的基线:最早的 CPU 中缺少)。
标签: c++ windows visual-studio c++11 icc