是否有Windows API以原子方式设置16字节数组
Is there a Windows API to set 16-byte array atomically?
我想知道是否有一个windows API可以原子地设置16字节数组?
我真的不愿意为了实现这些操作而在其中引入关键部分或互斥,所以我正在努力寻找一个更简单的解决方案。
PS。我需要这个,因为这个16字节的数组可以从工作线程写入,并且主要从主线程读取。
以下所有内容都假定采用64位x86_64体系结构。我相信,一般来说,您所要求的在32位x86上是不可能的。
实际上有两种选择。第一个是_InterlockedCompareExchange128
,翻译过来就是LOCK CMPXCHG16B
。要用它复制16字节存储的功能,您需要做以下操作:
__int64* dest = ...;
__int64* orig = ...;
unsigned char ok;
do
{
__int64 high = dest[0];
__int64 low = dest[1];
ok = _InterlockedCompareExchange128(dest, high, low, orig);
}
while (!ok);
注意,因为这是一个互锁操作,所以它意味着相当于_ReadWriteBarrier
。这通常就是所谓的"原子"操作。
如果您想要一个纯存储,而不是比较交换,那么您可以在硬件上使用任何转换为对齐的16字节存储的东西。例如,MOVDQA
指令将符合条件。在C++中,它看起来像这样:
__m128i* dest = ...;
_mm_mfence();
_mm_store_si128(dest, _mm_loadu_si128((__m128i*)&orig));
_mm_mfence();
除非你有理由避免SSE指令,否则我认为第二个版本可能会更好。你可能还想根据自己的实际需求来决定是否要放松这两个记忆障碍。
相关文章:
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 复制后删除原始数组指针将前 3 个字节设置为 0
- 是否强制转换void**并将第一个字节设置为nullptr
- 蓝牙LE:设置字节数组的特征会发送错误的值
- 如果字节中的所有位都设置为高,则设置为高字节
- 在 C++ 中立即设置故障位(在读取任何字节之前)
- 如何在没有循环的字节中设置位
- 你能为 Asio 的read_until设置字节限制吗?
- 以 C++ 为单位设置(短整型)的上下字节
- 如何在C++中设置短整型的上限和下限字节
- 如何正确设置fwrite()的大小和计数参数以编写一块字节
- 函数返回布尔值,只设置整个寄存器的1个字节
- 将 int 的所有字节设置为(无符号字符)0,保证表示零
- 如何在 Windows 中将文件大小设置为 100 字节 C++.
- C++/编译:是否可以设置VPTR(全局vtable + 2字节索引)的大小
- 如何使用 #define 语句来设置字节数组
- 如何告诉GCC通过编译器设置(不是编译指示)将结构大小边界设置为4字节?
- 设置 for 循环以循环,直到检测到空字节
- 是否有Windows API以原子方式设置16字节数组
- 如何设置整数的前三个字节?在C++中