【问题标题】:Is there bare c++ 11 (or boost) replacement for InterlockedExchangePointer?InterlockedExchangePointer 是否有裸 c++ 11(或 boost)替代品?
【发布时间】:2015-03-24 08:49:26
【问题描述】:

寻找可移植、简单和优雅的 Win32 InterlockedExchangePointer 替代品。理想情况下只使用 C++11,但 boost 也可以。

【问题讨论】:

  • std::atomic 提供交换功能,但仅当您可以将变量的类型更改为 std::atomic<T*>

标签: c++ multithreading winapi c++11 boost


【解决方案1】:

standard atomic types 有一个原子exchange 函数。所以微软人

PVOID volatile target;
old_value = InterlockedExchangePointer(&target, new_value);

会变成

std::atomic<T*> target;
old_value = target.exchange(new_value);

【讨论】:

  • 原子是否会产生完整的内存屏障?那么在其他线程中发生的指针操作是安全的吗?以及如何使用 shared_ptr? std::shared_ptr<:atomic>>?然后什么?如果可能的话,我如何在 shared_ptr 中交换底层指针
  • @kreuzerkrieg:每个问题一个问题。默认情况下,有一个完整的内存屏障,但您可以在第二个参数中指定其他内存排序。共享指针不提供原子交换操作,您必须做其他事情(使用单独的原子原始指针或互斥体)。
  • 看看我发现了什么en.cppreference.com/w/cpp/memory/shared_ptr/atomic 好像有共享指针的原子交换
  • @kreuzerkrieg:原来如此,我不知道。
猜你喜欢
  • 2015-10-18
  • 2016-02-17
  • 2014-09-30
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2013-08-23
  • 2017-03-25
相关资源
最近更新 更多