哲学家就餐问题php代码,哲学家就餐问题代码

// 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\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;

}

具体分析参考相关章节

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值