在 C++ Standard Template Library (STL) 中,有几个锁的实现,这些都位于 <mutex>
头文件。以下是一些常见的锁及其功能:
- std::mutex:最基本的互斥锁,不可递归使用。该锁提供了独占的非公平锁定能力。
std::mutex mtx;
mtx.lock(); // 获取锁
// 临界区代码
mtx.unlock(); // 释放锁
- std::recursive_mutex:递归互斥锁,允许同一个线程对同一个互斥体多次上锁。
std::recursive_mutex rmtx;
rmtx.lock(); // 第一次锁定
rmtx.lock(); // 第二次锁定,该线程不会被阻塞
// 临界区代码
rmtx.unlock(); // 第一次解锁
rmtx.unlock(); // 第二次解锁
- std::timed_mutex:带有超时功能的互斥锁,允许尝试上锁一段时间。
std::timed_mutex tmtx;
if (tmtx.try_lock_for(std::chrono::seconds(1))) {// 获取锁tmtx.unlock();
}
- std::recursive_timed_mutex:递归和带有超时的互斥锁。
std::recursive_timed_mutex rtmtx;
if (rtmtx.try_lock_for(std::chrono::seconds(1))) {// 获取锁rtmtx.unlock();
}
- std::lock_guard:是 RAII(Resource Acquisition Is Initialization)风格的包裹器,确保锁在作用域中被安全的获取和释放。
std::mutex mtx;
{std::lock_guard<std::mutex> lock(mtx);// 临界区代码
} // lock 自动释放
- std::unique_lock:比
std::lock_guard
更为灵活,允许延迟锁定、时间锁定、重复锁定和解锁和转移锁所有权等。
std::mutex mtx;
std::unique_lock<std::mutex> ulock(mtx, std::defer_lock); // 延迟锁定
ulock.lock(); // 显示调用锁定
// 临界区代码
ulock.unlock(); // 如果需要可以提前解锁
- std::shared_mutex(C++17 引入):读写锁,支持多个读者(共享锁)或单一写者(独占锁)。
std::shared_mutex smtx;
{std::shared_lock<std::shared_mutex> lock(smtx); // 共享锁// 多个线程可以同时读取数据(非临界区代码)
} // 共享锁自动释放{std::unique_lock<std::shared_mutex> lock(smtx); // 独占锁// 临界区代码,只有一个线程可以写数据
} // 独占锁自动释放
这些锁提供了多种不同线程同步和互斥的机制,以解决多线程程序中的竞态条件和其他同步问题。开发者可以根据不同的需要选择合适的锁使用。