【发布时间】:2020-03-03 00:01:50
【问题描述】:
我知道is_lock_free 取决于硬件,但是当我在 ADT 上使用它时,它返回 false 但使用 int 类型返回 true。这怎么可能?
#include <iostream>
#include <atomic>
struct myType {
size_t ID{};
size_t to{};
};
int main() {
std::atomic<myType> i{ };
std::cout << "\n" << i.is_lock_free();
std::atomic j { 1};
std::cout << "\n" << j.is_lock_free();
}
【问题讨论】:
-
可能是因为处理器已经优化了指令以在
int的单个指令中执行加载/存储,这意味着您不需要锁?原子数据类型保证它将“原子地”完成,但不一定在单个指令中完成,因此在内部使用锁或其他锁定原语。 -
您的处理器似乎能够对 int 大小的内存值执行原子操作,但不能对
2 * sizeof(size_t)大小的内存值执行原子操作。这并非不合理。处理器将无法再以原子方式运行。您无法合理地期望能够对 1GB 内存块执行原子写入。 -
@RaymondChen 所以这仅取决于硬件。这是否意味着我的处理器(核心 i 7 - 9750 H)很差?
-
@asmmo 不,它使它正常:-)
-
这也取决于编译器,以及它使用的库是否支持更大的原子。
标签: c++ multithreading c++17 atomic