繁体   English   中英

具有堆栈变量的C ++ 11线程安全

[英]C++11 Thread-safety with stack variables

我对C ++ 11中的新线程感到有些困惑。 我知道如何使用互斥锁来阻止两个线程同时对同一数据进行操作,但是分配给该数据又如何呢?

例!

class Foo
{
    std::string s;

    // This would be called on a seperate thread
    void Bar() { s = std::string( "blah blah blah" ); }
};

所以我要问的是,因为我要给s赋值,所以成员变量s是否始终保持在相同的内存位置,并且赋值只是更改了内部数据,在这种情况下,我只需要一个互斥体? 还是我仍然可以进入带有缓存值的情况,这意味着我需要开始使用atomic <>来确保我拥有最新数据? 还是仅针对int或struct等类型?

互斥体保证足够。 为了使它起作用,需要任何魔法,它们都包含其中。 只要访问或修改s任何特定实例的每个线程都在同一个互斥锁的保护下进行操作,就不会有问题。

访问和分配之间的唯一区别是,您不需要互斥体来防止两个线程同时读取相同的数据。 仅当在一个线程中修改一个对象而另一个线程正在或可能正在访问一个对象时,才需要使用互斥锁。 允许并发读取。

请注意,这是通常的规则,适用于诸如std::string类的典型对象。 如果愿意的话,即使在并发读取时,甚至在一个线程中读取一个对象,而在另一线程中读取相同类型的不同对象时,也可以使对象破裂。 (但是这类对象没有用,人们不应该制造它们。)

暂无
暂无

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

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