- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 class
(class A
),它使用监视器模式来安全访问 std::deque
。任何时候我需要简单地添加或删除一个元素我都很好。但有时不同的 class
(class B
) 需要调用并获取对 class A 中
。 deque
中元素的引用
我一直在向该元素返回一个迭代器
,但是另一个线程有可能将一个新元素“推送”到类A
中并使迭代器无效B 类
正在使用。我能想到的防止这种情况的唯一方法是在返回 iterator
之前锁定 class A
中的 mutex
,然后让 class B
在完成释放 mutex
后调用另一个函数,但这看起来很老套。
有什么更简洁的方法吗?
最佳答案
无论您如何处理,归结为使用 std::mutex
来实现对对象和类成员的线程安全访问。
您可以使用足够长的 std::mutex
来制作对象或类成员的拷贝,然后将拷贝返回给调用者,以便按需要进行处理。
但是如果您不想创建共享类成员或对象的私有(private)线程拷贝,这几乎是唯一的方法。这是相当基础的,所有类型的高级线程安全库最终都会在基础层面上这样做。
在 C++11 中,可以使用 lambda 来实现一些语法糖。让我们来看一个实现线程安全 int
的简单案例:
class safe_int {
int n;
std::mutex m;
public:
template<typename functor_type>
void lock(functor_type &&functor)
{
std::unique_lock<std::mutex> lock(m);
functor(n);
}
};
然后,以线程安全的方式访问 int
:
void do_something_with(safe_int *i)
{
i->lock([]
(int &n)
{
// Do something with 'n'. Use it. Set its value, whatever.
});
}
辅助类方法获取互斥体上的锁,并使用锁定的互斥体调用 lambda,将对受互斥体保护的私有(private)类成员的引用传递给 lambda。当 lambda 返回时,锁会自动释放。
展望 future ,不再需要显式锁定和解锁互斥体,只需调用 lock()。线程安全由契约强制执行。
关于c++ - 如何维护对另一个类中元素的线程安全引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32281028/
我是一名优秀的程序员,十分优秀!