【问题标题】:Atomically exchange pointer with nullptr用 nullptr 原子交换指针
【发布时间】:2017-08-06 04:28:59
【问题描述】:

如何在单个原子操作中进行以下操作?这可能吗?

 LARGE_INTEGER* ptr; // field

 void method()
 {
       LARGE_INTEGER* local = ptr;
       ptr = nullptr;
 }

所以我想将字段中的指针存储到本地指针中并立即将该字段设置为nullptr

换句话说,我想在单个原子操作中将指针从字段移动到局部变量中。

【问题讨论】:

  • LARGE_INTEGER* local = InterlockedExchangePointer(&ptr, nullptr); 可能需要对第一个参数进行强制转换。
  • @IgorTandetnik 可以无锁吗?
  • 如图所示是无锁的。
  • @IgorTandetnik 它说LARGE_INTEGER**volatile PVOID * 类型的参数不兼容
  • 使用std::atomic,或重新实现等效项。

标签: c++ pointers nullptr


【解决方案1】:

从 C++11 开始,您可以像这样使用 std::atomic 来实现此目的:

#include <atomic>
LARGE_INTEGER value;
std::atomic<LARGE_INTEGER*> ptr{&value};
LARGE_INTEGER* local = ptr.exchange(nullptr);

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多