gpt4 book ai didi

c++ - 如何维护对另一个类中元素的线程安全引用

转载 作者:行者123 更新时间:2023-11-28 02:21:32 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com