C++基础面试题, C++ 中 lock_guard 和 unique_lock 的区别?
C++基础面试题, C++ 中 lock_guard 和 unique_lock 的区别?
QA
Step 1
Q:: C++
中 lock_guard 和 unique_lock 的区别?
A:: lock_guard 和 unique_lock 都是用于管理互斥锁的RAII(Resource Acquisition Is Initialization)类,但它们有一些关键的区别。lock_guard 是一个简单的封装类,用于在构造时锁定互斥锁,并在析构时自动解锁。它不提供手动解锁和延迟锁定的功能。unique_lock 则更加灵活,允许手动锁定和解锁,支持延迟锁定、尝试锁定和转移所有权。此外,unique_lock 比 lock_guard 更加重,适用于需要灵活管理锁定时间的场景。
Step 2
Q:: 什么是 RAII?它在 C++
中的作用是什么?
A:: RAII(Resource Acquisition Is Initialization)是一种 C++
编程习惯,它确保资源在对象的生命周期内正确地分配和释放。通过在对象的构造函数中分配资源,并在析构函数中释放资源,RAII 可以防止资源泄漏。RAII 广泛应用于内存管理、文件管理和锁管理中,确保资源的正确管理。
Step 3
Q:: 为什么在多线程编程中需要使用互斥锁?
A:: 在多线程编程中,多个线程可能会同时访问共享资源,这会导致数据竞争和不一致的状态。互斥锁用于确保同一时刻只有一个线程能够访问共享资源,从而避免数据竞争。通过锁定和解锁互斥锁,程序员可以控制线程的执行顺序,确保线程安全性。
Step 4
Q:: 如何避免死锁?
A:: 避免死锁的方法包括:1)按照一定的顺序锁定多个资源,确保线程以相同的顺序获取锁;2)避免长时间持有锁,尽可能缩短持有锁的时间;3)使用尝试锁定(如 std::try_lock)来检测并处理潜在的死锁情况;4
)采用死锁检测算法来动态检测和处理死锁。