您的位置:首页 > 编程语言

哲学家就餐问题代码

2015-07-22 09:24 651 查看
// Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
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\n",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\n",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\n", GetLastError());
return 1;
}
}

Sleep(-1);
return 0;
}


具体分析参考<现代操作系统>相关章节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: