Программирование синхронизации процессов в ОС Windows. Разработка программы, осуществляющей решение поставленной задачи с помощью многопоточного приложения

Страницы работы

Содержание работы

ЛАБОРАТОРНАЯ РАБОТА №5

Программирование синхронизации процессов в ОС Windows

Цель работы: разработать программу, осуществляющую решение поставленной задачи с помощью многопоточного приложения

Задание

Разработать многопоточное приложение вычисляющее параллельно значения заданной функции на отрезке [A; B] и на отрезке [C; D] с шагом x . Все коээфициенты

i j k  ,  ,  и значение функции f (x) вычислять параллельнов отдельных потоках (должно быть не менее 5 параллельных потоков). Результаты вычислений сохранять в текстовые файлы. В первый файл сохранить результаты вычислений функции f (x) на отрезке [A; B]

и все коэффициенты i j k  ,  ,  , во второй – значения f (x) на отрезке [A; B] на отрезке

[C;D]. Для синхронизации потоков использовать указанные средства синхронизации.

Обеспечить монопольный доступ к файлам каждому из потоков, для этого использовать средства синхронизации, согласно варианта (таблица 5.1).

Условие задачи

Средство

синхронизации

потоков

Средство синхрони

зации при доступе к

файлам

11

События

Семафоры

Текст программы:

#include <windows.h>

#include <stdio.h>

#include <math.h>

#include <ctime>

#include <iostream>

#include <string.h>

#define MAX_SIZE_BUF 50

#define MAX_SIZE_MESSAGE 1000

#define ID_TEXTBOX_A 2

#define ID_TEXTBOX_B 3

#define ID_TEXTBOX_C 4

#define ID_TEXTBOX_D 5

#define ID_TEXTBOX_PARTS_1 6

#define ID_TEXTBOX_PARTS_2 7

#define MAX_SIZE_MESSAGE 1000

#define MAX_BUF_COEF_SIZE 1001

#define NUM_EVENTS 7

#define ID_EVENT_ALPHA 0

#define ID_EVENT_BETA 1

#define ID_EVENT_Y 2

#define ID_EVENT_GAMMA 3

#define ID_EVENT_INTEGRAND 4

#define ID_EVENT_FILE 5

#define ID_EVENT_INTEGRAL 6

#define NUM_THREADS 6

#define ID_THREAD_ALPHA 0

#define ID_THREAD_BETA 1

#define ID_THREAD_Y 2

#define ID_THREAD_GAMMA 3

#define ID_THREAD_INTEGRAND 4

#define ID_THREAD_FILE 5

// Äàííûå, ñîäåðæàùèåñÿ â ýòîé ñòðóêòóðå äëÿ êàæäîãî èíòåðâàëà (ïîòîêà) ñâîè.

typedef struct

{

char message[MAX_SIZE_MESSAGE];

char messageLog[MAX_SIZE_MESSAGE];

char intervalName[10];

double xBegin, xEnd, xCurrent, deltaX;

long numOfParts;

double alpha[MAX_BUF_COEF_SIZE], beta[MAX_BUF_COEF_SIZE], gamma[MAX_BUF_COEF_SIZE], yValue[MAX_BUF_COEF_SIZE], func, integral;

double result, time;

HANDLE hEventMain;

HANDLE hEventReady;

HANDLE hEvents[NUM_EVENTS];

HANDLE hThreads[NUM_THREADS];

} Buffer;

// Îáúÿâëåíèå áóôåðîâ äëÿ äâóõ èíòåðâàëîâ:

Buffer *bufAB;

Buffer *bufCD;

// Îáùèå äàííûå äëÿ âñåõ ïîòîêîâ:

HANDLE hEventExit;     // ñîáûòèå äëÿ âûõîäà

HANDLE hSemaphoreFile; // ñîáûòèå äëÿ çàïèñè â ôàéë

HWND *hwndMain;  // Óêàçàòåëü íà ãëàâíîå îêíî

// Ïðîòîòèïû ôóíêöèé äëÿ ïîòîêîâ:

DWORD WINAPI ThreadCalcIntegral(LPVOID lParam); // äëÿ âû÷èñëåíèÿ èíòåãðàëà

DWORD WINAPI ThreadCoefAlpha(LPVOID lParam);    // äëÿ âû÷èñëåíèÿ çíà÷åíèé êîýôôèöèåíòîâ àëüôà

DWORD WINAPI ThreadCoefBeta(LPVOID lParam);     // äëÿ âû÷èñëåíèÿ çíà÷åíèé êîýôôèöèåíòîâ áåòà

DWORD WINAPI ThreadYValue(LPVOID lParam);       // äëÿ âû÷èñëåíèÿ çíà÷åíèé èãðèê

DWORD WINAPI ThreadCoefGamma(LPVOID lParam);   // äëÿ âû÷èñëåíèÿ çíà÷åíèé êîýôôèöåíòîâ ãàìììà

DWORD WINAPI ThreadIntegrand(LPVOID lParam);    // äëÿ âû÷èñëåíèÿ çíà÷åíèÿ èíòåãðàëà

DWORD WINAPI ThreadOutputToFile(LPVOID lParam); // äëÿ âûâîäà â ôàéë çíà÷åíèé

DWORD WINAPI ThreadOutputCommonInfo(LPVOID lParam); // äëÿ âûâîäà â ôàéë îáùåé èíôîðìàöèè  (âðåìÿ âûïîëíåíèÿ îáîèõ èíòåãðàëîâ)

// Ïðîòîòèïû ôóíêöèé îáðàáîòêè ñîáûòèé äëÿ îêíà:

long WM_CREATE_ON(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); // Ñîçäàíèå îêíà

long WM_COMMAND_ON(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); // Íàæàòà êíîïêà

long WM_DESTROY_ON(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); // Çàêðûòèå îêíà

// Àâòîìàòè÷åñêè ñîçäàííûé êîä...

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "CodeBlocksWindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nCmdShow)

{

setlocale(LC_ALL, "Russian");

HWND hwnd;

MSG messages;

WNDCLASSEX wincl;

wincl.hInstance = hThisInstance;

wincl.lpszClassName = szClassName;

wincl.lpfnWndProc = WindowProcedure;

wincl.style = CS_DBLCLKS;

wincl.cbSize = sizeof (WNDCLASSEX);

wincl.hIcon = LoadIcon (0, IDI_APPLICATION);

wincl.hIconSm = LoadIcon (0, IDI_APPLICATION);

wincl.hCursor = LoadCursor (0, IDC_ARROW);

wincl.lpszMenuName = 0;

wincl.cbClsExtra = 0;

wincl.cbWndExtra = 0;

wincl.hbrBackground = (HBRUSH) COLOR_WINDOW;

if (!RegisterClassEx (&wincl))

return 0;

Похожие материалы

Информация о работе