라인 잠금(철학자 식사부터 매표 시스템까지)

2071 단어
모두 철학자가 가장 똑똑하다고 말하지만, 확실히 그렇다. 그러나 때때로 철학자는 가장 멍청하다. 멍청하게 기다리고, 멍청하게 생각하고, 뜻밖에도 이미 자물쇠 상태에 빠져 앉아서 굶어 죽기를 기다린다.
다음은 매표 시스템을 예로 들어 자물쇠가 끊어진 것을 설명하고 코드를 직접 올린다.
#include <windows.h>
#include <iostream.h>

DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);

int tickets = 100;

CRITICAL_SECTION g_csA;
CRITICAL_SECTION g_csB;

int main()
{
	HANDLE hThread1;
	HANDLE hThread2;
	hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
	hThread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);

	InitializeCriticalSection(&g_csA);
	InitializeCriticalSection(&g_csB);

	Sleep(4000);

	DeleteCriticalSection(&g_csA);
	DeleteCriticalSection(&g_csB);

	cout << "flag" << endl;

	return 0;
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
	while(1)
	{
		EnterCriticalSection(&g_csA);
		Sleep(1);
		EnterCriticalSection(&g_csB);

		if(tickets > 0)
		{
			Sleep(1);
			cout << "thread1 sell ticket : " << tickets-- << endl;
			LeaveCriticalSection(&g_csB);
			LeaveCriticalSection(&g_csA);
		}
		else
		{
			break;
		}
	}
	
	return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
	while(1)
	{
		EnterCriticalSection(&g_csB);
		Sleep(1);
		EnterCriticalSection(&g_csA);

		if(tickets > 0)
		{
			Sleep(1);
			cout << "thread2 sell ticket : " << tickets-- << endl;
			LeaveCriticalSection(&g_csA);
			LeaveCriticalSection(&g_csB);
		}
		else
		{
			break;
		}
	}

	return 0;
}

결과는 flag뿐입니다.스레드가 다운되었습니다.철학자 카드가 죽었어.

좋은 웹페이지 즐겨찾기