gpt4 book ai didi

c++ - scoped_lock 访问资源的优雅模式?

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:00 27 4
gpt4 key购买 nike

我在容器中有对象,这些对象使用互斥锁进行访问控制。我经常做这样的事情:

rsrc *r;
{
scoped_lock l(mtx);
r = container.pop( );
}
// ... use r

(我使用 scoped_lock 来确保异常等后的清理)但是,我不喜欢 { ... } block ,它不是显式控制结构的一部分(它只是为 scoped_lock 创建一个范围) ) 并且我不喜欢 r 的空初始化,然后是 { ... } block 中的(可能但不确定)赋值。

我可以这样做:

inline rsrc *locked_pop( mutex &mtx, container &c ) { scoped_lock l(mtx); return c.pop( ); }

然后

rsrc *r = locked_pop( mtx, container );

这没问题,但在某些情况下,我需要在同一锁下从相同(或不同)的容器中获取多个项目。

您知道执行此操作的优雅、通用的方法吗? (这不是具体的 Boost 问题,但我正在使用这些库,所以 Boost-ism 会很好。)

最佳答案

您可以使用 lambda。

template<class F>
decltype(auto) while_locked(mutex& m,F&&f){
auto lock = scoped_lock(m);
return std::forward<F>(f);
}

像这样使用:

auto* r = while_locked(mtx, [&]{return container.pop( );});

现在,我喜欢将我的锁绑定(bind)到我锁定的数据上。所以我写了thread_safe<T>这暴露了read(F&&)constwrite(F&&)const-> const .

他们的签名类型是[T]->(T->U)->U , 其中[T]是一个包裹 T , (T->U)F传入,U是什么F返回。

读取获取读取锁,写入写入锁,->返回一个带有重载 -> 的读锁持有对象运算符(operator)返回 T const* .

我们还可以通过对互斥体进行排序来处理多重访问。

然后我们得到:

auto* r = container.write([](auto&&container){return container.pop_back();});

有点圆滑。

->技巧依赖于 a->b 的事实定义为 (a.operator->())->b对于非指针类型。所以我们可以返回一个持有锁的临时对象,它有一个 operator->。返回指针。

这让我们可以做 bool b = container->empty() ,它无缝地执行读锁定,读取 empty 的值,存储它,然后解锁读锁。

关于c++ - scoped_lock 访问资源的优雅模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36250260/

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