C++11/14/17中mutex系列区别

C++11/14/17中提供的mutex系列类型如下:

C++11/14/17中mutex系列区别

以上系列的对象都提供了加锁(lock)、尝试加锁(try_lock)和解锁(unlock)方法。

为了避免死锁,std::mutex.lock方法和std:mutex.unlock方法需要成对使用,如果一个函数中有很多出口,而互斥体对象又是需要在整个面数作用域被保护的资源,那么我们在编码时会因为忘记在某个出口处调用std::mutex.unlock 而造成死锁。这时可以通过RAII技术封装这两个接口,C++新标准也提为我们提供了类似的封装:

C++11/14/17中mutex系列区别

C++服务器开发学习资料:点击领取→音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

如std::lock_guard:

void func()
{
  std::lock quard quard(mymutex);
  //在这里放被保护的资源操作
}

mymutex 的类型是std:mutex,guard对象的构造函数会自动调用mymutex.lock 方法对 mymutex 进行加锁,在 guard 对象出了其作用域时,guard对象的析构函数会自动调用 mymutex.unlock 方法对 mymutex 进行解锁,简单来说:根据 RAII原则,在构造函数中上锁(创建即上锁),在析构函数中解锁(销毁即解锁)。需要注意的是:mymutex 生命周期必须长于func 函数的作用域。

多线程使用锁经验总结:

  1. 减少锁的使用次数,能不用锁尽量不用;
  2. 明确锁的范围;
  3. 减少锁的使用粒度,尽量减少锁的作用的临界区代码范围。
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章