给冲 2020-08-25 22:51 采纳率: 100%
浏览 123
已采纳

关于网络编程,为什么要用RAII的方式加锁解锁? 是不是降低了性能?

陈硕的《Linux多线程服务端编程:使用muduo C++网络库》一书有提到,
如果要加锁,则必须用RAII的方式,即对象构造时加锁,对象析构时解锁。

c++11里lock_guard()和unique_lock()里采用的也都是这种方式。

可这样安全是安全了,但锁粒度不可避免也会随之变大,性能就变差了,特别是多线程服务器程序遇到高并发环境时,感觉这一点会很要命

下面举两个简单的例子:

这个是使用RAII方式加锁

{
    lock_guard<mutex> guard(mutex);  // 构造对象并加锁
    vec.push_back(20);               // 操作共享资源
    if (a == 30) {                   // 判断
        // 复杂操作
    }
}
...                                  // 对象析构并解锁, 其他线程获取锁

这个是正常加锁和解锁

{
    mutex.lock();                    // 加锁
    vec.push_back(20);               // 操作共享资源
    mutex.unlock();                  // 解锁, 其他线程获取锁
    if (a == 30) {                   // 判断
        // 复杂操作
    }
}

从以上代码来看RAII方式加锁真的合适吗? 如果开发人员有能力判断什么时候准确解锁,是不是就完全不需要使用这种方式了? 因为看到知乎很多人推那本书,所以自己产生了困惑。

希望有经验丰富的后台开发人员帮忙解答!谢谢!

  • 写回答

2条回答 默认 最新

  • 关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP