철학자 식사 문제 코드
2363 단어 잡담
// Test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
using namespace std;
#define LEFT(n) ((n+4)%5)
#define RIGHT(n) ((n+1)%5)
class MySemaphore
{
public:
MySemaphore::MySemaphore(long nInitCount)
{
m_sem = CreateSemaphore(NULL,nInitCount,MAXLONG32,NULL);
}
bool down(DWORD dwMilliseconds)
{
if (m_sem)
{
DWORD dwRet = WaitForSingleObject(m_sem,dwMilliseconds);
if (WAIT_OBJECT_0 == dwRet)
{
return true;
}
}
return false;
}
bool up()
{
if (m_sem)
{
return ReleaseSemaphore(m_sem,1,NULL) ? true : false;
}
return false;
}
private:
HANDLE m_sem;
};
enum PersonState
{
STATE_THINKING,
STATE_WAITING,
STATE_EATING,
};
MySemaphore personArr[5] = {0,0,0,0,0};
PersonState stateArr[5] = {STATE_THINKING,STATE_THINKING,STATE_THINKING,STATE_THINKING,STATE_THINKING};
MySemaphore mutex = 1;
void test(int nIndex)
{
if (stateArr[nIndex] == STATE_WAITING &&
stateArr[LEFT(nIndex)] != STATE_EATING&&
stateArr[RIGHT(nIndex)] != STATE_EATING)
{
stateArr[nIndex] = STATE_EATING;
personArr[nIndex].up();
}
}
void take_fork(int nIndex)
{
mutex.down(INFINITE);
stateArr[nIndex] = STATE_WAITING;
test(nIndex);
mutex.up();
personArr[nIndex].down(INFINITE);
}
void put_fork(int nIndex)
{
mutex.down(INFINITE);
stateArr[nIndex] = STATE_THINKING;
printf("person %d put fork and thinking
",nIndex+1);
test(LEFT(nIndex));
test(RIGHT(nIndex));
mutex.up();
}
DWORD WINAPI PersonProc( LPVOID lpParam )
{
int nThreadIndex = (int)lpParam;
for(;;)
{
take_fork(nThreadIndex);
printf("person %d take fork and eating
",nThreadIndex+1);
Sleep(1000); //eating;
put_fork(nThreadIndex);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE aThread[5];
for(int i=0; i < 5; i++ )
{
aThread[i] = CreateThread(
NULL, // default security attributes
0, // default stack size
(LPTHREAD_START_ROUTINE) PersonProc,
(void*)i, // no thread function arguments
0, // default creation flags
NULL); // receive thread identifier
if( aThread[i] == NULL )
{
printf("CreateThread error: %d
", GetLastError());
return 1;
}
}
Sleep(-1);
return 0;
}
구체적인 분석은 관련 장과 절을 참고한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Koin원티드나 로켓펀치로 내가 일할 곳은 어디인가 하는 마음으로 경건히 안드로이드 개발자 구직 글을 보다 보면 우대조건에 mvp,mvvm,di,rxjava는 거의 고정이다. (경력은 자격요건에 다 요구) mvvm을 제외하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.