我是C++多线程的新手(显然,它与python多线程/多处理不同,因为多个线程可以在单个进程中使用多个CPU)。我知道,如果2个线程试图同时更改相同的数据,或者一个线程在另一个线程更改它的同时读取某个数据,则会出现竞争状态,但是我不确定以下情况是否需要同步:
假设我有以下类(class):

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); 
} 
安全:
  • 有一个线程在另一个对象正在读写对象时执行static_cast或dynamic_cast吗?
  • // thread 1 
    a->name = "Bar"; 
    // thread 2 
    Dog* d = static_cast<Dog*>(a); 
    
  • 是否有一个线程读取对象的属性,而另一个线程正在写入同一对象的另一个属性?根据这篇文章(Accessing different data members belonging to the same object from 2 different thread in C++),这似乎还可以,但显然会导致缓存问题?

  • 谢谢

    请您参考如下方法:

    不要去那
    如果存在仅由一个线程写入/读取的数据,则根据定义它不是共享数据,也不必是全局的。
    如果存在由一个线程写入并最终由另一个线程读取的数据,请使用锁,std::atomic或其他一些与同步的关系,并将其称为一天。
    读取static_castdynamic_cast和解引用。

  • 不应该参加比赛。
  • 只要对齐正确并且成员不是位域,就不应该参加比赛。

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


    评论关闭
    IT序号网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!