是否有一个std :: lock_guard的变种在构造时解锁并锁定在C++ 11中的销毁?

Ryp*_*Ryp 5 c++ mutex std c++11

我曾多次编写一些代码,这些代码可以从"反向"lock_guard中受益,就像在这个简短的例子中一样.

std::lock_guard<std::mutex> lg(_eventQueueMutex);
while (!_eventQueue.empty())
{
    Event e = _eventQueue.top();

    _eventQueue.pop();
    _eventQueueMutex.unlock(); // Manual unlock
    dispatchEvent(e);
    _eventQueueMutex.lock(); // Manual lock
}
Run Code Online (Sandbox Code Playgroud)

有没有办法用C++ 11中的自动lock_guard替换内部解锁/锁定?

vz0*_*vz0 9

您可以编写自己的unlock_guard:

template <class T>
class unlock_guard {
public:
  unlock_guard(T& mutex) : mutex_(mutex) {
    mutex_.unlock();
  }

  ~unlock_guard() {
    mutex_.lock();
  }

  unlock_guard(const unlock_guard&) = delete;
  unlock_guard& operator=(const unlock_guard&) = delete;

private:
  T& mutex_;
};
Run Code Online (Sandbox Code Playgroud)

  • 您缺少`T&`成员,可能希望`删除'复制构造函数和赋值运算符以保证清晰. (4认同)