作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我对 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 或结构等类型?
最佳答案
互斥体保证足够。无论需要什么魔法才能让它发挥作用,它们都有。只要访问或修改 s
的任何特定实例的每个线程都在 same 互斥体的保护下这样做,就不会有问题。
访问和赋值之间的唯一区别是——您不需要互斥量来防止两个线程同时读取相同的数据。只有当一个对象可能在一个线程中被修改而另一个线程正在或可能正在访问它时,才需要互斥锁。允许并发读取。
请注意,这是通常的规则,适用于 std::string
等典型对象。如果愿意,可以创建一个对象,该对象即使在并发读取时也能收支平衡,甚至当一个对象在一个线程中读取而同一类型的不同对象在另一个线程中读取时也是如此。 (但是这样的东西没有用,人们不应该制造它们。)
关于C++11 线程安全与堆栈变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8708087/
我是一名优秀的程序员,十分优秀!