繁体   English   中英

多线程:写入后首先从另一个线程进行访问...我需要使用volatile吗?

[英]Multithreading: first access from another thread after being written… do I need volatile?

希望这个问题易于理解。 无论如何,让我们写一些代码...

struct MyClass 
{
    int a;
    std::vector<char> b;
    ...
}

MyClass object;

假设我正在运行两个线程A和B:

  1. 线程A创建对象并读取或写入除a和b之外的一些数据成员。
  2. 线程A将指向对象的指针传递给将在线程B中运行的函数。
  3. 线程B向向量b写a或将数据添加到向量b。
  4. 线程A读取a和b(即,第一次访问它们)。

如果答案是肯定的,即在这种情况下我需要使用volatile,那么我还有另一个问题:为什么使用不可变对象在线程中写数据,而在多个线程中读取数据成员,这在线程上是安全的呢? 似乎与这种情况非常相似:)

为什么使用不可变对象在线程中是安全的,因为数据成员是在一个线程中写入而在其他多个线程中读取的呢?

创建不可变的对象,然后在那之后再也不会更改。 由于仅在对象创建后(在此之前要共享什么),才可以对对象进行多线程访问,因此每个线程将始终看到相同的值。

因此,永远不会有不可变对象在单独的线程上出现不同的情况,因为不可变对象共享后无法更改状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM