如何解决以下情况会在多线程中创建竞争条件吗?
我是C ++多线程的新手(显然,它与python多线程/多处理不同,因为多个线程可以在一个进程中使用多个CPU)。我知道,如果2个线程试图同时更改同一数据,或者如果一个线程在另一个线程更改它的同时读取了某个数据,则会出现竞争状态,但是我不确定以下情况是否需要同步: / p>
假设我有以下课程:
08/26/2020 07:39 PM
08/26/2020 07:54 PM
08/26/2020 10:58 AM
08/26/2020 07:54 PM
08/26/2020 12:01 AM
08/26/2020 12:01 AM
08/26/2020 12:01 AM
安全吗?
- 有一个线程在另一个对象正在读写对象时执行static_cast或dynamic_cast吗?
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);
}
- 有一个线程读取对象的属性,而另一个线程正在写入同一对象的另一个属性吗?根据这篇帖子(Accessing different data members belonging to the same object from 2 different thread in C++的说法,这似乎还不错,但显然会导致缓存问题?
谢谢
解决方法
不要去那里。
如果存在仅由一个线程写入/读取的数据,则根据定义它不是共享数据,也不必是全局的。
如果有一个线程写入并最终被另一个线程读取的数据,请使用锁,std::atomic
或其他一些 synchronizes-with 关系并将其称为一天。 / p>
static_cast
,dynamic_cast
和取消引用是读取的。
-
不应该是种族。
-
只要对齐正确并且成员不是位域,就不应该参加比赛。
但是最重要的是,在现代C ++中,您必须使用 synchronizes-with 关系或明确告诉编译器某些数据是通过std::atomic
共享的。在任何多线程程序中,甚至在玩具示例中,总有一个线程读取另一个线程写入的内容。此时,需要同步。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。