Автор работы: Пользователь скрыл имя, 26 Декабря 2010 в 23:52, задача
На круглом столе находятся k тарелок с едой, между которыми лежит столько же вилок, k=4,…,7. В комнате имеется k философов, чередующих философские размышления с принятием пищи. За каждым философом закреплена своя тарелка; для еды философу нужны две вилки, причем он может использовать только вилки, примыкающие к его тарелке. Требуется так синхронизировать философов, чтобы каждый из них мог получить за ограниченное время доступ к своей тарелке. Предполагается, что длительности еды и размышлений философа конечны, но заранее недетерминированы (могут быть выбраны случайным образом из некоторого диапазона).
1 Постановка задачи 3
2 Выводы 4
Приложение А Листинг программы 5
Приложение Б Пример протокола выполнения программы 13
}
else
{
}
}
time = (rand()*wait_time)/RAND_MAX;
GetLocalTime
Sleep(time);
GetLocalTime
GetTimeForma
GetTimeForma
swprintf(
EnterCritica
SendMessage(
LeaveCritica
}
}
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(
UNREFERENCED_PARAMETER(
// TODO: Place code here.
MSG msg;
HACCEL
hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_PP2, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable
= LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PP2));
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if
(!TranslateAccelerator(msg.
{
TranslateMes
DispatchMess
}
}
return (int) msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX
wcex;
wcex.cbSize
= sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PP2));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_PP2);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm =
LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle
in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
LOGFONT lf;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfPitchAndFamily = DEFAULT_PITCH;
wcscpy_s(lf.lfFaceName, L"Arial");
lf.lfHeight = -15;
lf.lfStrikeOut = 0;
lf.lfUnderline = 0;
lf.lfQuality = DEFAULT_QUALITY;
lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
lf.lfWeight = FW_NORMAL;
lf.lfWidth = 6;
lf.lfOrientation = lf.lfEscapement = 0;
lf.lfItalic = FALSE;
hFont
= CreateFontIndirect(&lf);
hEdCount = CreateWindow(L"Edit", L"5", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_NUMBER,
100, 50, 100, 22, hWnd, NULL, hInstance, NULL);
SendMessage(hEdCount,
WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);
hButStart = CreateWindow(L"Button", L"Запустить", WS_VISIBLE | WS_CHILD,
100, 100, 100, 22, hWnd, (HMENU)ID_START, hInstance, NULL);
SendMessage(hButStart,
WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);
hTable = CreateWindow(L"Listbox", L"", WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_HASSTRINGS | LBS_NOSEL | WS_VSCROLL,
250, 50, 500, 300, hWnd, NULL, hInstance, NULL);
SendMessage(hTable,
WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);
InitializeCriticalSection(&
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR
str[11];
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case ID_START:
if(!started)
{
GetWin
count = _wtoi(str);
if(
{
}
else
{