C++ 中的互斥函数和 lambda 函数
Mutexes and lambda functions in c++
在处理并发问题时,我经常使用std::unique_lock<std::mutex>
和std::lock_guard<std::mutex>
,两者都没有问题。
我还扩展了std::mutex
以便能够按如下方式使用它:
mutex.protect([](){
// my protected code here
}) ;
它锁定互斥锁并在 lambda 调用周围释放它。
这种类似的行为是否已经在 boost 或标准库中实现?
Boost Thread 有这个: http://www.boost.org/doc/libs/1_58_0/doc/html/thread/synchronization.html#thread.synchronization.with_lock_guard
您可以像预期的那样使用它:
std::mutex mx;
boost::with_lock_guard(mx, []{
// protected stuff
});
它甚至支持通常的调用语义:
int foo(int,double) { return 42; }
// ...
int answer = boost::with_lock_guard(mx, foo, 3, 3.14);
仅标准库手动实施
您可以轻松地自己添加这样的东西:
template <typename M, typename F, typename... Args>
auto my_with_lock_guard(M& mx, F&& f, Args&&... args) {
std::lock_guard<M> lk(mx);
return std::forward<F>(f)(std::forward<Args>(args)...);
}
如果标准采用了这样的建议,你可以很容易地把它换掉。
如果你只想在函数内保护较小范围内的代码,则不需要通过编写自己的保护函数来扩展互斥锁。您可以执行以下操作,使用大括号创建本地作用域,当作用域退出时,互斥锁将以异常安全的方式自动解锁。
double process_func() {
// do some stuff
{ //start a new scope block
std::lock_guard<my_mutex> g; // mutex is locked here.
[]() { } // your lambda that needs to be protected
} // Mutex is released here.
// do more stuff
}
当然,这比您的自定义函数有缺点,很难维护。有人可以稍后来注入更多代码,而不知道他们在做什么。
相关文章:
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 在构造函数中使用 lambda 的 C++ 类
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++:Lambda 函数指针转换的用例是什么?
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- std::映射服装比较函数和函数/lambda错误
- 在可移动类型的构造函数 lambda 中捕获此内容的安全使用
- 排序测试模板化函数 lambda:非法使用此类型作为表达式
- 将匿名函数(lambda)保存为函数类型变量
- 如何编写将自身作为回调传递的匿名函数/lambda