c++ - 有条件地使用 std::lock_guard

标签 c++ c++11 scope locking conditional

我有一个函数,语句 foo 应该在 lock_guard 下执行,但只有当一个指向 mutex 对象的指针被提供给函数作为参数。否则 foo 不必lock_guard 保护。

我不能在 if使用 lock_guard,因为当 if 阻塞时锁会立即释放结束。

所以,这段代码是胡说八道:

bar( std::mutex * optionalMutex = nullptr )
{
   ...
   if ( nullptr != optionalMutex ) {
      std::lock_guard<std::mutex> lockScope( *optionalMutex );
   }          <- Here the lock ends

   foo...     <- foo is not protected when optionalMutex was provided
}

我尝试过这样的事情:

bar( std::mutex * optionalMutex = nullptr )
{
   ...
   nullptr == optionalMutex ? 0 : std::lock_guard<std::mutex> lockScope( *optionalMutex );

   // this scope should be protected by lock_guard when optionalMutex was provided

   foo...
}

或多或少,对我来说唯一可能的解决方案是重复 foo:

bar( std::mutex * optionalMutex = nullptr )
{
   ...
   if ( nullptr != optionalMutex ) {
      std::lock_guard<std::mutex> lockScope( *optionalMutex );
      foo...
   }  else {
      foo...
   }
}

编译器 gcc 4.9.3 未编译第二个示例并报错:error: expected primary-expression before 'lockScope'更新: Superlokkus 在他的回答中解释了原因。

但我确实想避免任何代码重复,因此也要避免重复 foo

我的问题:

有没有一种优雅的方式来解决这个问题,使用重复的foo。我知道,我可以使用 lambda 函数来 group foo 但我很好奇是否有其他解决方案。

最佳答案

这个怎么样?

void bar(std::mutex * optionalMutex = nullptr)
{
        auto lockScope = (optionalMutex == nullptr) ? 
                           std::unique_lock<std::mutex>() 
                         : std::unique_lock<std::mutex>(*optionalMutex);
}

解释:您的编译器对您之前的语句有问题,因为您不能突然更改三元 ? 的类型表达;即文字 0不是 std::lock_guard反之亦然。于是我把两个分支改成了同类型,这里是std::unique_lock<std::mutex>因为lock_guard没有设计为在没有有效互斥锁的情况下使用。但还是更喜欢std::lock_guard超过 std::unique_lock在更简单的情况下,因为它会使您的代码更具可读性。

您的语句对于编译器也不可行,即即使语法正确,因为变量 lockScope 只会存在于一个分支中。

关于c++ - 有条件地使用 std::lock_guard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38610307/

相关文章:

c++ - 如何在 C++ 中使用字符串文字初始化动态字符数组?

c++ - 将成员函数从基类移动到派生类会无缘无故地破坏程序

c++ - std::make_unique 和 std::unique_ptr 与 new 的区别

c++ - 树递归错误

c++ - 没有用于方法调用的可行的 std::weak_ptr 到 std::shared_ptr 的转换

javascript - 函数提升在有和没有 block 范围的情况下显示不同的结果

php - 确定闭包在 PHP 中是否是静态的

sql - Rails ActiveRecord 中的复杂连接

utf 8 语言环境中的 C++ 字符串操作

c++ - 为什么我的静态整数没有在主函数中显示更改的值?