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
这样的典型对象。如果愿意,可以创建一个对象,使其在并发读取时不中断,甚至在一个线程中读取一个对象而在另一个线程中读取相同类型的不同对象时也不中断。(但是这样的对象是没有用的,人们不应该制造它们。)
相关文章:
- 类与私有变量的其他类之间的线程安全性
- 调用socket.remote_endpoint(提升 asio 库)线程安全性
- std::lock_guard 似乎提供了线程安全性,尽管作用域块
- C++中向量和列表的非写入成员函数的线程安全性
- 线程安全性和静态变量/成员功能
- 是仅使用get或toplown的原始类型的线程安全性的威胁
- 提高 ASIO stream_descriptor和事件 FD 线程安全性
- OpenMP中树结构的线程安全性
- 静态变量初始化的线程安全性
- 从另一个(非 qt)线程调用 QObject 方法的线程安全性?
- C 共享_ptr如何确保线程安全性
- 编写std::vector与普通数组的线程安全性
- C++标准库容器相对于所包含对象的线程安全性
- 读取和写入操作的线程安全性C++
- Qt库-静态成员函数的线程安全性
- QObject可重入性和线程安全性
- std::map中的线程安全性
- boost::asio io_service 和 std::containers 的线程安全性
- C++11 std:原子<T>复制构造函数的线程安全性
- Clang 线程安全性分析和线程角色