std::lock_guard, std::unique_lock 에서 lock, unlock 호출 시점 확인 하기
프로그래밍/c,c++ 2021. 12. 1. 17:50반응형
std::lock_guard 은 생성 시점에 lock을 호출하고 소멸 시점(블럭 끝)에 unlock을 호출 한다.
std::unique_lock 은 생성 시점에 lock을 호출하고 소멸 시점(블럭 끝)에 unlock을 호출 하고
추가로 lock, unlock을 호출 할수 있다(lock 에 대한 상태값 유지).
#include <iostream>
#include <string>
#include <mutex>
class TestMutex {
public:
void lock() {
std::cout << "call lock" << std::endl;
}
void unlock() {
std::cout << "call unlock" << std::endl;
}
};
TestMutex mutex1;
int main() {
std::cout << "###### lock_guard start" << std::endl;
{
std::lock_guard<TestMutex> lockGuard(mutex1);
std::cout << "lock_guard created" << std::endl;
}
std::cout << "###### lock_guard end" << std::endl << std::endl;
std::cout << "###### unique_lock start" << std::endl;
{
std::unique_lock<TestMutex> uniqueLock(mutex1);
std::cout << "unique_lock created" << std::endl;
}
std::cout << "###### unique_lock end" << std::endl << std::endl;
std::cout << "###### unique_lock start 2" << std::endl;
{
std::unique_lock<TestMutex> uniqueLock(mutex1);
std::cout << "unique_lock created" << std::endl;
std::cout << "manual call unlock ++" << std::endl;
uniqueLock.unlock();
std::cout << "manual call unlock --" << std::endl;
}
std::cout << "###### unique_lock end 2" << std::endl << std::endl;
std::cout << "###### unique_lock start 3" << std::endl;
{
std::unique_lock<TestMutex> uniqueLock(mutex1);
std::cout << "unique_lock created" << std::endl;
std::cout << "manual call unlock ++" << std::endl;
uniqueLock.unlock();
std::cout << "manual call unlock --" << std::endl;
std::cout << "manual call lock ++" << std::endl;
uniqueLock.lock();
std::cout << "manual call lock --" << std::endl;
}
std::cout << "###### unique_lock end 3" << std::endl << std::endl;
return 0;
}
실행 결과
$ ./a.out
###### lock_guard start
call lock
lock_guard created
call unlock
###### lock_guard end
###### unique_lock start
call lock
unique_lock created
call unlock
###### unique_lock end
###### unique_lock start 2
call lock
unique_lock created
manual call unlock ++
call unlock
manual call unlock --
###### unique_lock end 2
###### unique_lock start 3
call lock
unique_lock created
manual call unlock ++
call unlock
manual call unlock --
manual call lock ++
call lock
manual call lock --
call unlock
###### unique_lock end 3
반응형