자물쇠로 잠그고 서로 풀어줄 때까지 대기 하고 있는 상태

 

왼쪽 스레드가 자물쇠 1을 점유하고 있고 자물쇠 2를 소유하려고 대기 하고 있는 상태

오른쪽 스레드가 자물쇠 2를 점유하고있고 자물쇠 1을 소유하려고 대기 하고 있는 상태를 말한다

 

이런 원이은 순서가 달라서 인데

 

왼쪽은 1번을 잠그고 2번을 잠그려고 시도 하는것이고

 

오른쪽은 2번을잠그고 1번을 잠그려고 시도 하는것이다

 

이 문제를 해결하려면 순서를 위에 있는 자물쇠 먼저 잠그고 그다음 아래 있는 자물쇠를 잠그도록 규칙을 정해주면 됨

 

 

 

#pragma once
#include <mutex>


class User
{

};

class UserManager
{
public:
	static UserManager* Instance()
	{
		static UserManager instance;
		return &instance;
	}
	User* getUsert(int32 id)
	{
		lock_guard<mutex> guard(_mutex);
		//뭔가 갖고 옴
		return nullptr;
	}

	//
	void processSave();

private:
	mutex _mutex;
};


====================================

#include "pch.h"
#include "UserManager.h"
#include "AccountManager.h"

void UserManager::processSave()
{
	//user lock
	lock_guard<mutex> guard(_mutex);

	//account lock 을 검 여기서
	Account* account = AccountManager::Instance()->getAccount(100);

}

 

#pragma once
#include <mutex>


class Account
{

};

class AccountManager
{
public:
	static AccountManager* Instance()
	{
		static AccountManager instance;
		return &instance;
	}
	Account* getAccount(int32 id)
	{
		lock_guard<mutex> guard(_mutex);
		//뭔가 갖고옴
		return nullptr;
	}

	void processLogin();

private:
	mutex _mutex;


	//map<int32, Account*> _accounts;

};


=========================================
#include "pch.h"
#include "AccountManager.h"
#include "UserManager.h"


void AccountManager::processLogin()
{
	//유저 정보를 갖고와서 로그인 처리를 한다 가정
	// 
	//account lock
	lock_guard<mutex> guard(_mutex);


	//user lock 을 하게 된다 이 함수내부에서 lock 의 lock 이 되는 현상이 발생함
	User* user = UserManager::Instance()->getUsert(100);



}

 

 

 

#include "pch.h"
#include <iostream>
#include "CorePch.h"
#include <thread>	
#include <atomic>			//멀티 플랫폼에서 작동 가능
#include <vector>
#include <mutex>
#include "AccountManager.h"
#include "UserManager.h"

using namespace std;

void func1()
{
	for (int32 i=0;i<100;++i)
	{
		UserManager::Instance()->processSave();
	}
}


void func2()
{
	for (int32 i = 0; i < 100; ++i)
	{
		AccountManager::Instance()->processLogin();
	}
}

int main()
{

	thread t1(func1);
	thread t2(func2);

	t1.join();
	t2.join();

	cout << "Jobs Done" << endl;


	return 0;
}

 

 

 

 

 

데드락 상황 정리

 

이 문제를 해결하려면 순서를 위에 있는 자물쇠 먼저 잠그고 그다음 아래 있는 자물쇠를 잠그도록 규칙을 정해주면 됨

 

 

반응형

+ Recent posts