gpt4 book ai didi

c++ - std::atomic_store 和 std::atomic_exchange 不交换

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:53 29 4
gpt4 key购买 nike

根据 en.cppreference.com , std::atomic_exchangestd::atomic_store 等价于线程安全的 std::swap。但这不是我使用 g++ 或 clang++ 得到的行为。

Problem live on coliru. (见下文)

它虽然打印了这个:

std::atomic_store

a: 0x1ed2c30 0
b: 0x1ed2c50 1

a: 0x1ed2c50 1
b: 0x1ed2c50 1

std::atomic_exchange

a: 0x1ed2c50 0
b: 0x1ed2c30 1

a: 0x1ed2c30 1
b: 0x1ed2c30 1

这是为什么?难道我做错了什么?我是否误读了文档?

代码 list

#include <iostream>
#include <memory>

int main()
{
{
std::cout << "std::atomic_store\n\n";
auto a = std::make_shared<int>(0);
auto b = std::make_shared<int>(1);

std::cout
<< "a: " << a.get() << '\t' << *a << '\n'
<< "b: " << b.get() << '\t' << *b << '\n' << std::endl;

std::atomic_store(&a, b);

std::cout
<< "a: " << a.get() << '\t' << *a << '\n'
<< "b: " << b.get() << '\t' << *b << '\n' << std::endl;
}
{
std::cout << "std::atomic_exchange\n\n";
auto a = std::make_shared<int>(0);
auto b = std::make_shared<int>(1);

std::cout
<< "a: " << a.get() << '\t' << *a << '\n'
<< "b: " << b.get() << '\t' << *b << '\n' << std::endl;

std::atomic_exchange(&a, b);

std::cout
<< "a: " << a.get() << '\t' << *a << '\n'
<< "b: " << b.get() << '\t' << *b << '\n' << std::endl;
}
}

最佳答案

该描述有些误导。

它说,例如,

template<class T>
void atomic_store( std::shared_ptr<T>* p,
std::shared_ptr<T> r );

“有效地”执行 p->swap(r)。就目前而言,这是正确的(并且实际上也是标准所说的)。

但是,r 是按值传递的函数参数,因此在函数返回之前被销毁。它不会影响调用方的任何内容。

关于c++ - std::atomic_store 和 std::atomic_exchange 不交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35073200/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com