【问题标题】:Is atomicity preserved between std::atomic operations?std::atomic 操作之间是否保留了原子性?
【发布时间】:2016-06-05 08:51:00
【问题描述】:

我已经定义了以下内容:

std::atomic_int m_decoding_thread_count;

可以保证以下是原子的吗?或者我可以让 load() 的结果与 ++ 的结果不同吗?即两个线程可以分配相同的thread_id吗?

int thread_id = (++m_decoding_thread_count).load();

更新

正如this response 中正确指出的那样,上面的代码无法编译(我的错)。我看到的替代方案是:

选项 1:

++m_decoding_thread_count;
int thread_id = m_decoding_thread_count.load();

选项 2:

int thread_id = m_decoding_thread_count.fetch_add(1)++;

我可以看到选项 1 不是原子的。另一方面,选项 2 可能几乎是原子的,除了根据我对文档的理解, fetch_add() 将返回值 before 进行添加,因此必须在后验增加它。 我错过了什么吗?

【问题讨论】:

    标签: c++11 std atomic


    【解决方案1】:

    编辑后的代码现在没有意义了。 operator++.fetch_add(1) 的简写,但它返回一个普通的 int。你不能打电话给load,这样做也没有任何意义。

    【讨论】:

    • 谢谢。我已经添加了我现在如何看待它的更新。我目前正在代码周围放置一个互斥锁,但在我看来,这样一个简单的操作应该可以在没有任何额外代码的情况下实现原子操作。
    • 你把它变成了一个移动的目标。在发布之前,我建议您进行更多思考和更多测试。
    • 感谢您的关心,但我的问题仍未得到解答。希望其他人能够帮助我。
    猜你喜欢
    • 2015-11-29
    • 1970-01-01
    • 2023-03-23
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多