|
C++多线程编程中使用std::lock_guard自动管理互斥锁示例代码:
- case FD_READ: {
- char tempBuf[RECV_BUFFER_SIZE];
- int len = recv(m_socket, tempBuf, RECV_BUFFER_SIZE - 1, 0);
- if (len > 0) {
- std::lock_guard<std::mutex> lock(m_bufferMutex);
- m_recvBuffer.insert(m_recvBuffer.end(), tempBuf, tempBuf + len);
- ::PostMessage(m_hMsgWnd, WM_SOCKET_NOTIFY, FD_READ, 0);
- }
复制代码
在C++多线程编程中,std::lock_guard的设计遵循RAII(资源获取即初始化)原则,其核心特性是自动管理互斥锁的生命周期。具体分析如下:
自动解锁机制
std::lock_guard会在构造函数中自动获取锁,在析构函数中自动释放锁。当代码执行离开当前作用域(如case FD_READ的代码块结束)时,lock对象的析构函数会被调用,从而自动释放m_bufferMutex。
异常安全保障
即使m_recvBuffer.insert()或PostMessage抛出异常,lock_guard也能确保互斥锁被正确释放,避免死锁风险。这是其相比手动lock()/unlock()的核心优势。
作用域限定
示例中的lock_guard作用域仅限于if(len > 0)的代码块,当程序执行到break语句时,lock对象会立即析构并释放锁。
因此,该代码不需要显式调用解锁操作,这是std::lock_guard的预期行为。若需更灵活的锁控制(如中途释放锁),可改用std::unique_lock。
|
|