-
식사하는 철학자Operations Dev/Food 2010. 12. 10. 21:22
// Chapter06.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <string>
#include <windows.h>
#include <process.h>#include <iostream>
using namespace std;int const MAX_FORK = 5;
int const MAX_PHILOSOPHER = 5;
HANDLE g_forks[ MAX_FORK ];
HANDLE g_room;
void eat( string const & philosopher );
void think( string const & philosopher );
unsigned int WINAPI startDinner( LPVOID param );int _tmain(int argc, _TCHAR* argv[])
{
string philo[MAX_PHILOSOPHER] = {"Socrates", "Plato", "Fredeu", "Kant", "Kongja"};
DWORD threadIDs[MAX_PHILOSOPHER];
HANDLE threadHandles[ MAX_PHILOSOPHER ];for( int i = 0; i < MAX_FORK; ++i )
{g_forks[ i ] = ::CreateSemaphore( NULL, 1, 1, NULL );
}
g_room = ::CreateSemaphore( NULL, 4, 4, NULL );for(int i =0; i<MAX_PHILOSOPHER; ++i)
{
threadHandles[i] = (HANDLE) ::_beginthreadex( NULL, 0 , startDinner,(LPVOID*)(&philo[i]),0,(unsigned int *)&threadIDs[i]);
}DWORD result = ::WaitForMultipleObjects(MAX_PHILOSOPHER, &threadHandles[0],TRUE,INFINITE);
if(result == WAIT_OBJECT_0)
{}
for( int i = 0; i < MAX_FORK; ++i )
{::ReleaseSemaphore(g_forks[i],1,NULL);
}
::ReleaseSemaphore(g_room,1,NULL);
for(int i = 0; i< MAX_PHILOSOPHER; ++i)
{
CloseHandle(threadHandles[i]);
CloseHandle(g_forks[i]);
}
CloseHandle(g_room);
return 0;
}
void eat( string const & philosopher )
{::Sleep( 100 );
cout << philosopher+" eat something.\n";
//printf("%s eat something.\n",philosopher);
}void think( string const & philosopher )
{::Sleep( 100 );
cout << philosopher+" think something.\n";
//printf("%s think something.\n",philosopher);}
unsigned int WINAPI startDinner( LPVOID param )
{
string ch = *((string *)param);
for(int i =0 ; i< MAX_FORK ; i++)
{think(ch);
DWORD result = ::WaitForSingleObject(g_room,INFINITE);
DWORD result2 = ::WaitForSingleObject(g_forks[i],INFINITE);
result2 = ::WaitForSingleObject(g_forks[i+1%5],INFINITE);eat(ch);
::ReleaseSemaphore(g_forks[i+1%5],1,NULL);
::ReleaseSemaphore(g_forks[i],1,NULL);
::ReleaseSemaphore(g_room,1,NULL);
}return 0;
}