std::lock_guard
是 C++ 标准库中的一个类模板,用于简化互斥体(mutex)的管理。它通常与 std::mutex
或 std::recursive_mutex
一起使用,以确保在作用域结束时自动释放锁,从而避免死锁和其他并发问题。
std::lock_guard
的设计目的是提供一个简单的 RAII(Resource Acquisition Is Initialization)风格的锁管理。当 std::lock_guard
对象被创建时,它会自动锁定互斥体,当对象离开其作用域时,它会自动解锁互斥体。
lock()
和 unlock()
,减少了出错的可能性。std::lock_guard
也能确保互斥体被正确解锁。std::lock_guard
是一个模板类,通常使用 std::mutex
或其派生类作为模板参数。
适用于需要在一段代码块中保护共享资源的场景,例如:
要收紧 std::lock_guard
的作用域,可以将它限制在需要保护的代码块内。这样可以减少锁的持有时间,提高并发性能。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 全局互斥体
void print_block(int n, char c) {
// 使用 lock_guard 自动管理锁的生命周期
{
std::lock_guard<std::mutex> guard(mtx); // 锁定互斥体
for (int i = 0; i < n; ++i) {
std::cout << c;
}
std::cout << '\n';
} // 离开作用域时自动解锁互斥体
// 这里不需要锁,可以进行其他不需要同步的操作
}
int main() {
std::thread th1(print_block, 50, '*');
std::thread th2(print_block, 50, '$');
th1.join();
th2.join();
return 0;
}
原因:如果 std::lock_guard
的作用域过大,会导致锁的持有时间过长,影响并发性能。
解决方法:将 std::lock_guard
的作用域限制在实际需要保护的代码块内。
void print_block(int n, char c) {
// 其他不需要同步的操作
do_something_without_locking();
{
std::lock_guard<std::mutex> guard(mtx); // 锁定互斥体
for (int i = 0; i < n; ++i) {
std::cout << c;
}
std::cout << '\n';
} // 离开作用域时自动解锁互斥体
// 其他不需要同步的操作
do_something_without_locking();
}
通过这种方式,可以确保锁只在必要时被持有,从而提高程序的并发性能。
std::lock_guard
是一个强大的工具,用于简化互斥体的管理。通过合理地收紧其作用域,可以有效地减少锁的持有时间,提高多线程程序的性能和安全性。
领取专属 10元无门槛券
手把手带您无忧上云