我可以使整个 C++ class 的数据成为 std::atomic<>
Can I make the data of an entire C++ class be std::atomic<>
我有一个class,用于数据存储,只有一个实例。
调用者是消息驱动的并且变得太大并且是重构的主要候选者,以便每条消息由单独的线程处理。但是,这些可能会与 read/write 数据竞争。
如果我使用互斥锁(mutices?),我只会在写操作时使用它们。我认为这里不重要,因为数据是原子的,而不是访问数据的函数。
有什么简单的方法可以使所有数据原子化吗?目前它由其他 classes 的简单类型、向量和对象组成。如果我必须在每个子字段中添加 std::atomic<>
,我还不如使用互斥体。
std::atomic
要求该类型可以轻松复制。由于您说 std::vector
涉及,因此无法在整个结构或 std::vector
本身上使用它。
std::atomic
的目的是能够原子地替换对象的整个值。您不能执行访问个人成员等操作。
根据您在问题中给出的有限上下文,我认为 std::mutex
是正确的方法。每个应该可以独立访问的对象都应该有自己的互斥锁来保护它。
另请注意,互斥锁通常需要保护写入 和 读取,因为与写入不同步发生的读取是数据竞争并导致未定义的行为,而不仅仅是不同步的写入。
我有一个class,用于数据存储,只有一个实例。
调用者是消息驱动的并且变得太大并且是重构的主要候选者,以便每条消息由单独的线程处理。但是,这些可能会与 read/write 数据竞争。
如果我使用互斥锁(mutices?),我只会在写操作时使用它们。我认为这里不重要,因为数据是原子的,而不是访问数据的函数。
有什么简单的方法可以使所有数据原子化吗?目前它由其他 classes 的简单类型、向量和对象组成。如果我必须在每个子字段中添加 std::atomic<>
,我还不如使用互斥体。
std::atomic
要求该类型可以轻松复制。由于您说 std::vector
涉及,因此无法在整个结构或 std::vector
本身上使用它。
std::atomic
的目的是能够原子地替换对象的整个值。您不能执行访问个人成员等操作。
根据您在问题中给出的有限上下文,我认为 std::mutex
是正确的方法。每个应该可以独立访问的对象都应该有自己的互斥锁来保护它。
另请注意,互斥锁通常需要保护写入 和 读取,因为与写入不同步发生的读取是数据竞争并导致未定义的行为,而不仅仅是不同步的写入。