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

标签 c++ multithreading thread-safety c++11 atomic

我对 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<>来确保我拥有最新数据的情况吗?或者这仅适用于整数或结构等类型?

最佳答案

互斥体保证足够。无论需要什么魔法才能发挥作用,它们都包含在内。只要访问或修改 s 任何特定实例的每个线程都在相同互斥体的保护下进行操作,就不会有问题。

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

请注意,这是通常的规则,适用于 std::string 等典型对象。如果愿意,可以创建一个在并发读取时甚至在一个线程中读取一个对象而在另一个线程中读取相同类型的不同对象时平衡的对象。 (但是这样的东西没有用,人们不应该制造它们。)

关于C++11 堆栈变量的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8708087/

相关文章:

c++ - 实现信号量

C# 值类型赋值是原子的吗?

c++ - 关于 GNU ld 'legacy __sync_synchronize' 警告,我该怎么办?

c++ - 检查数组是否为标量类型

c - if(fork()) 是否创建子进程?

c++ - Clang 和 C++ 模块 TS

java - 如何实现多个 BitTorrent 公告请求的超时?

multithreading - 使用内存sqlite数据库时,QSqlQuery是否有线程锁

c++ - 带有字符串变量指令的 C/C++ 内联汇编程序

c++ - 为什么 std::round(sin(pi/6)) 不等于 1?