여러 프로세스가 하나의 자원을 점유하려고 하는 상황이 발생할 수도 있다. 이 때, 프로세스가 점유하고 있는 자원에 또 다른 프로세스가 점유하기 위해 기다리게 된다. 이 현상이 무한루프에 빠지는 것을 DeadLock이라고 한다.
DeadLock 상태가 발생하는 조건은 4가지로 정리된다.
C++에서는 mutex
를 기반으로 하여 Deadlock 상태를 방지한다. lock_guard
는 객체 생성 시 lock이 되며, 객체가 소멸하면 자동으로 unlock된다.
#include "pch.h"
#include <iostream>
#include "CorePch.h"
#include <thread>
#include <atomic>
#include <mutex>
#include "AccountManager.h"
#include "UserManager.h"
void Func1()
{
for (int32 i = 0; i < 1000; i++)
{
UserManager::Instance()->ProcessSave();
}
}
void Func2()
{
for (int32 i = 0; i < 1000; i++)
{
AccountManager::Instance()->ProcessLogin();
}
}
int main()
{
thread t1(Func1);
thread t2(Func2);
t1.join();
t2.join();
cout << "Jobs Done" << endl;
}
void UserManager::ProcessSave()
{
// accountLock
Account* account = AccountManager::Instance()->GetAccount(100);
// userLock
lock_guard<mutex> guard(_mutex);
// accountLock
// Account* account = AccountManager::Instance()->GetAccount(100);
// 이 상태일경우, user와 account 모두 lock이 걸릴 수도 있다.
// 따라서, accountLock의 순서를 첫번째로 수정하면 deadlock에 걸리지 않는다.
}
#include "pch.h"
#include "AccountManager.h"
#include "UserManager.h"
void AccountManager::ProcessLogin()
{
// accountLock
lock_guard<mutex> guard(_mutex);
// userLock
User* user = UserManager::Instance()->GetUser(100);
}