c++ - 在单编写器多阅读器情况下,是否需要为uint64_t锁定?

标签 c++ c concurrency

class Foo {
public:
    void set(uint64_t new_var) { var_ = new_var; }
    uint64_t get() { return var_; }
private:
    uint64_t var_;
};
如果一个作者是多读者的,是否需要锁定setget

最佳答案

Is there necessary need a lock in set and get if one writer multi-reader?


您不一定需要锁定,但是需要同步,这可以通过锁定互斥锁或简单地声明变量 atomic 来实现。
在C++中:std::atomic<uint64_t> var_;在C中:_Atomic uint64_t var_;无论数据类型如何,在C和C++语言中,至少涉及一个编写器时,并发访问的每个变量都需要同步。
这与编译器在生成代码时对指令的排序方式有关。在没有同步的情况下,按照as-if rule的要求,允许编译器假定每个线程都是独立执行的,并且对变量进行重新排序以其认为合适的任何方式进行。由于无法预测结果,因此非同步访问将使程序立即进入未定义行为的 Realm 。例如,可以将该变量优化到CPU寄存器中,并且两个线程根本不会注意到它的变化,或者可以在程序中的不同时间将其写入内存。
另外,在许多CPU架构(不包括x86)上,64位读/写实际上不是原子的。因此,即使代码恰好布置得很好,也可能仍然无法正常工作。

关于c++ - 在单编写器多阅读器情况下,是否需要为uint64_t锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63789423/

相关文章:

c - txt 文件执行了一些奇怪的字符

c# - 缓慢的 ApplicationSettingsBase

ruby-on-rails - 我应该在每次操作的基础上将高速率用户操作发布到我的服务器,还是在 session 关闭后发送一批事件?

language-agnostic - 互斥体是如何实现的?

c++ - 如何声明内部模板类?

c++ - 在 boost transformed() 之后比较嵌套迭代器

c - 根据字节顺序对整数进行位操作

c - 如何将命令行参数读取为整数而不是字符串?

c++ - 当您增加 vector 中结构的大小时会发生什么?

c++ - 如何在 MacOS 上的 g++ 中使用 gcc 内置 __sync_bool_compare_and_swap?