ЛАБОРАТОРНАЯ РАБОТА №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;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.