陈硕的《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方式加锁真的合适吗? 如果开发人员有能力判断什么时候准确解锁,是不是就完全不需要使用这种方式了? 因为看到知乎很多人推那本书,所以自己产生了困惑。
希望有经验丰富的后台开发人员帮忙解答!谢谢!