【问题标题】:Can is_lock_free() return true for some data types and false for another one?is_lock_free() 是否可以为某些数据类型返回 true 而为另一种数据类型返回 false?
【发布时间】: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


【解决方案1】:

is_lock_free() 能否对某些数据类型返回 true 而对另一种数据类型返回 false?

是的,可以。显示的程序有可能输出 0 1。

事实上,如果不是这样,那么函数就没有必要成为模板的成员了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多