我可以将整个 C++ 类的数据设置为 std::atomic<>

Maw*_*awg 0 c++ stdatomic c++14

我有一个类,用于数据存储,其中只有一个实例。

调用者是消息驱动的,并且变得太大,是重构的主要候选者,这样每个消息都由单独的线程处理。然而,这些可能会竞争读/写数据。

如果我使用互斥体(mutices?),我只会在写操作上使用它们。我认为这并不重要,因为数据是原子的,而不是访问数据的函数。

有没有什么简单的方法可以使所有数据原子化?目前它由简单类型、向量和其他类的对象组成。如果我必须添加std::atomic<>到每个子字段,我也可以使用互斥体。

use*_*522 5

std::atomic要求类型可以简单地复制。既然你说的std::vector是涉及,那么就无法使用它,无论是在整个结构上还是在其std::vector本身上。

的目的std::atomic是能够原子地替换对象的整个值。您不能执行诸如访问个别成员之类的操作。

从您在问题中给出的有限背景来看,我认为这std::mutex是正确的方法。每个可独立访问的对象都应该有自己的互斥锁来保护它。

另请注意,互斥体通常需要保护写入读取,因为与写入不同步发生的读取是一种数据竞争,并且会导致未定义的行为,而不仅仅是不同步的写入。