unique_lock是一类独占锁,当其获取锁的所有权后,其他所有的unique_lock和shared_lock均无法获取到锁。
当unique_lock无法获取锁时,其会阻塞,直到其他对象释放锁,才会继续执行。
以下是代码验证(windows环境下执行):
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <mutex>
#include <windows.h>
using namespace std;
class A {
public:
void funcOne() {
std::unique_lock<std::mutex> um(m_mutex);
for (int i = 0; i < 5; ++i) {
cout << "funcOne owns m_mutex" << std::endl;
Sleep(1000);
}
}
void funcTwo() {
cout << "funcTwo not owns m_mutex" << std::endl;
// 由于funcOne先执行,获取到m_mutex的所有权,因此funcTwo阻塞在此处,直到锁被释放
std::unique_lock<std::mutex> um(m_mutex);
for(int i = 0; i < 5; ++i) {
cout << "=====>>> funcTwo owns m_mutex" << std::endl;
Sleep(1000);
}
}
private:
std::mutex m_mutex;
};
int main() {
A a;
// 执行funcOne
std::thread myObjOne(&A::funcOne, &a);
// 确保funcOne先于funcTwo执行
Sleep(100);
// 执行funcTwo
std::thread myObjTwo(&A::funcTwo, &a);
myObjOne.join();
myObjTwo.join();
return 0;
}
以下是执行结果:
funcOne owns m_mutex
funcTwo not owns m_mutex
funcOne owns m_mutex
funcOne owns m_mutex
funcOne owns m_mutex
funcOne owns m_mutex
=====>>> funcTwo owns m_mutex
=====>>> funcTwo owns m_mutex
=====>>> funcTwo owns m_mutex
=====>>> funcTwo owns m_mutex
=====>>> funcTwo owns m_mutex
由此可见,当unique_lock无法获取到锁时,它是会阻塞的。
谢谢阅读