c++ 11堆栈变量的线程安全性

C++11 Thread-safety with stack variables

本文关键字:线程 安全性 变量 堆栈 c++      更新时间:2023-10-16

我对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这样的典型对象。如果愿意,可以创建一个对象,使其在并发读取时不中断,甚至在一个线程中读取一个对象而在另一个线程中读取相同类型的不同对象时也不中断。(但是这样的对象是没有用的,人们不应该制造它们。)