gpt4 book ai didi

c++ - 多线程:我需要用只读方法保护我的变量吗?

转载 作者:可可西里 更新时间:2023-11-01 18:25:48 26 4
gpt4 key购买 nike

关于使用锁来保护我的共享数据结构,我几乎没有疑问。我正在使用 C/C++/ObjC/Objc++

例如我有一个在多线程环境中使用的计数器类

class MyCounter {
private:
int counter;
std::mutex m;

public:
int getCount() const {
return counter;
}
void increase() {
std::lock_guard<std::mutex> lk(m);
counter++;
}
};
  1. 我需要使用 std::lock_guard<std::mutex> lk(m); 吗?在 getCount()使其成为线程安全的方法?

  2. 如果只有两个线程会发生什么情况:一个读取线程和一个写入线程,那么我是否必须保护它?因为只有一个线程正在修改变量,所以我认为不会发生丢失更新。

  3. 如果一个共享原始类型变量(例如 int )有多个写入器/读取器,如果我只锁定写入方法而不锁定读取方法,可能会发生什么灾难? 8 位类型与 64 位类型相比会有什么不同吗?

  4. 是否有任何基本类型在默认情况下都是原子的?例如写入 char总是原子的? (我知道这在 Java 中是正确的,但不知道 C++,如果平台很重要,我在 Mac 上使用 llvm 编译器)

最佳答案

是的,除非你能保证基础变量的变化counter是原子的,你需要互斥体。

经典例子,比如说counter是在(非原子)阶段递增的两字节值:

(a) add 1 to lower byte
if lower byte is 0:
(b) add 1 to upper byte

初始值为255。

如果另一个线程进入低字节更改 a 之间的任何位置和高位字节变化 b ,它将读取 0 而不是正确的 255(前增量)或 256(后增量)。

关于什么数据类型是原子的,最新的 C++ 标准在 <atomic> 中定义了它们。标题。

如果您具有 C++11 功能,则取决于实现哪些类型是原子的。

关于c++ - 多线程:我需要用只读方法保护我的变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9834752/

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