关键节内的InterlockedExchange(或类似的原子操作)
InterlockedExchange (or similar atomic operation) within a Critical Section?
本文关键字:原子操作 InterlockedExchange 更新时间:2023-10-16
我看到一些重复的代码(确切地说是方法),它们进入关键部分,然后使用InterlockedExchange。。。这有意义吗,因为我认为这个操作实际上是原子操作,不需要这样的同步?
{
EnterCricSectionLock lock (somelock);
InterlockedExchange(&somelong, static_cast<long>(newlongVal));
}
这基本上就是…
正常交换通常不是原子交换。然而,如果所有其他用途都受到同一个互斥体的保护,那么在拥有互斥体的情况下这样做是可以的。如果所有其他用途都是原子的,那么使用原子交换也是可以的。我能想到的在拥有互斥体的同时进行原子交换的唯一逻辑原因是,并不是所有对该值的使用都是受互斥体保护的。
单个原子操作不需要CS,但它可以充当围栏,在锁保持全局可见时更改任何内容(IIRC,显式围栏适用于SSE2+,但互锁操作根本不需要SSE),但它需要在任何全局存储之后。
这可能是有意义的,因为CS用于锁定对其他东西的访问,因此全局交换不是锁定的一部分。
相关文章:
- 对OpenMP reduction子句中的变量执行原子操作
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 标记为 std::memory_order_seq_cst 的单个原子操作是否会在所有位置触发顺序一致性?
- 对单个变量的原子操作
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 为什么互斥对象与原子操作不同,前者是操作系统级,后者是处理器级
- 原子变量的多重赋值是原子操作吗?
- 对标准类型使用原子操作
- 共享指针,C 版本的原子操作
- 即使在单线程程序中,共享指针是否在引用计数中使用原子操作
- 原子操作传播/可见性(原子负载与原子RMW负载)
- 为什么原子操作需要独家的缓存访问
- 在英特尔上自然对齐的POD类型的保证原子操作
- C++ 如何编写原子操作
- 原子操作示例'Concurrency in Action'的正确性
- 嵌套原子操作是否保证为原子操作
- 如何实现原子操作
- 如何使用原子操作fetch_or或test_and_set在指针中设置一点,而在C 11中不使用Amberare_
- 指针地址交换总是C++中的原子操作吗
- 何时不使用原子操作