1

我是 C++ 多线程的新手(显然它与 python 多线程/多处理不同,因为多个线程可以在单个进程中使用多个 CPU)。我知道如果 2 个线程尝试同时更改相同的数据,或者如果一个线程读取某些内容而另一个线程正在更改它,则会发生竞争条件,但我不确定以下情况是否需要同步:

假设我有以下课程:

class Animal{
public:
    string name_;
    Animal(string name);
    ~Animal();
};

class Dog : public Animal{
public:
    int price_;
    Dog(string name, int price);
    ~Dog();
};

class Cat : public Animal{
public:
    int price_;
    Cat(string name, int price);
    ~Cat();
};

void do_stuff(){
    Animal* a = new Dog("Foo", 3);
}

是否安全:

  1. 有一个线程执行 static_cast 或 dynamic_cast 而另一个线程正在读取或写入对象?
// thread 1
a->name = "Bar";
// thread 2
Dog* d = static_cast<Dog*>(a);
  1. 有一个线程读取对象的属性,而另一个线程正在写入同一对象的另一个属性?根据这篇文章(从 C++ 中的 2 个不同线程访问属于同一对象的不同数据成员)似乎没问题,但显然它会导致缓存问题?

谢谢

4

1 回答 1

1

不要去那里。

如果存在仅由一个线程写入/读取的数据,则根据定义,它不是共享数据,也不需要是全局的。

如果有数据由一个线程写入并最终由另一个线程读取,请使用锁,std::atomic或其他一些同步关系,并称之为一天。

static_cast, dynamic_cast, 和取消引用是读取。

  1. 不应该是赛跑。

  2. 只要对齐没问题并且成员不是位字段,就不应该是一场比赛。

但最重要的是,在现代 C++ 中,您必须使用synchronizes-with关系或明确告诉编译器某些数据是通过std::atomic. 在任何多线程程序中,甚至在玩具示例中,都会出现一个线程读取另一个线程编写的内容的点。此时,需要同步。

于 2020-08-26T22:26:25.127 回答