首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以下情况是否在多线程中创建竞争条件?

以下情况是否在多线程中创建竞争条件?
EN

Stack Overflow用户
提问于 2020-08-26 16:07:25
回答 1查看 76关注 0票数 1

我对C++多线程很陌生(显然它不同于python多线程/多线程处理,因为多个线程可以在单个进程中使用多个CPU)。我知道,如果两个线程同时尝试更改相同的数据,或者一个线程在另一个线程进行更改时读取某些数据,则会出现争用条件,但我不确定以下情况是否需要同步:

假设我有以下课程:

代码语言:javascript
运行
复制
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,而另一个线程正在读取或写入对象?

代码语言:javascript
运行
复制
// thread 1
a->name = "Bar";
// thread 2
Dog* d = static_cast<Dog*>(a);

  1. 让一个线程读取对象的属性,而另一个线程正在写入同一对象的另一个属性?根据这篇文章(Accessing different data members belonging to the same object from 2 different thread in C++),它似乎没问题,但显然它会给缓存?

带来问题。

谢谢

EN

Stack Overflow用户

回答已采纳

发布于 2020-08-26 22:26:25

别去那儿。

如果只有一个线程写入/读取数据,那么它就不是定义上的共享数据,也不需要是全局的。

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

static_castdynamic_cast和取消引用都是读的。

  1. 不应该是一场比赛。--

  1. 不应该是一场比赛,只要对齐正常并且成员不是位字段。

但底线是,在现代C++中,您必须使用带有关系的同步,或者显式地告诉编译器某些数据是通过std::atomic共享的。在任何多线程程序中,即使在玩具示例中,都会有一个线程读取另一个线程所写的内容。此时,需要同步。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63601509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档