Асинхронный ввод/вывод. Программа, осуществляющая решение задачи «поставщик-потребитель» с использованием асинхронного ввода/вывода

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

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

-МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

УЧРЕЗЖЕНИЕ ОБРАЗОВАНИЯ

ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ имени П.О. Сухого

Факультет автоматизированный и информационных систем

Кафедра: «Информационные технологии»

Отчёт по лабораторной работе №6

по дисциплине : ОМПиМПОД

на тему:«Асинхронный ввод/вывод»

                                                          Подготовил: студент группы ИТ-32

                  

                         Преподаватель:

                         

Гомель 2013 г.

Цель работы: разработать программу, осуществляющую  решение задачи «поставщик-потребитель» с использованием асинхронного ввода/вывода.

Задание:

Необходимо  разработать  двухпоточное  приложение  решающее  задачу  «поставщик-потребитель»  (таблица  6.1)  с  использованием  асинхронного  ввода/вывода.  Приложение должно  считывать  исходные  данных  из  двух  текстовых  файлов  в  асинхронном  режиме, проводить вычисления и сохранять результаты вычислений также в асинхронном режиме. 

Исходный файл 1

Исходный файл 2

Поток 1

Поток 2

Листингпрограммы:

#include <windows.h>

#include <stdio.h>

#include <math.h>

HANDLE Thread_read_file_1,

Thread_read_file_2,

Thread_1,

Thread_2,

Thread_write;

int x[1][9], y[1][9]; // вектор X и Y

int tMatrix[9][1]; // транспонированная матрица

int Matrix[9][9]; // матрица

float avg;

// асинхронное чтение данных из файла file1

DWORD WINAPI Read_file_1(LPVOID lpParameter)

{

HANDLE  hFile;                                     // дескриптор файла

HANDLE  hEndRead;                                  // дескриптор события

OVERLAPPED  ov;                                    // структура управления асинхронным доступом к файлу

hEndRead = CreateEvent(NULL, TRUE, FALSE, NULL);   // создаем события с автоматическим сбросом

// инициализируем структуру OVERLAPPED

ov.Offset = 0;   // младшая часть смещения равна 0

ov.hEvent = hEndRead; // событие для оповещения завершения чтения

// открываем файл для чтения

hFile = CreateFile("file1.txt",        // имя файла

GENERIC_READ,      // чтение из файла

FILE_SHARE_READ,   // совместный доступ к файлу

NULL,              // защиты нет

OPEN_EXISTING,     // открываем существующий файл

FILE_FLAG_OVERLAPPED, // асинхронный ввод

NULL);                // шаблона нет

DWORD  dwBytesRead; //количество прочитанных данных

char Buffer[9];

//читаем данные из файла

char jj[9];

int i=0;

while(i<1)

{

ZeroMemory(Buffer,sizeof(Buffer));

// читаем одну запись

ReadFile(hFile,          // дескриптор файла

Buffer,         // адрес буфера, куда читаем данные

sizeof(Buffer), // количество читаемых байтов

&dwBytesRead,   // количество прочитанных байтов

&ov);           // чтение асинхронное

WaitForSingleObject(hEndRead, INFINITE);

for (int j=0; j<9;j++)

{

jj[0]=Buffer[j];

x[i][j]=atoi(jj);

}

i++;

// увеличивает смещение в файле

ov.Offset += 11;

}

CloseHandle(hFile);

}

// асинхронное чтение данных из файла file2

DWORD WINAPI Read_file_2(LPVOID lpParameter)

{

HANDLE  hFile;

HANDLE  hEndRead;

OVERLAPPED  ov;

hEndRead = CreateEvent(NULL, TRUE, FALSE, NULL);

ov.Offset = 0;

ov.hEvent = hEndRead;

hFile = CreateFile("file2.txt",

GENERIC_READ,

FILE_SHARE_READ,

NULL,

OPEN_EXISTING,

FILE_FLAG_OVERLAPPED,

NULL);

DWORD  dwBytesRead;

char   Buffer[9];

//читаем данные из файла

char jj[9];

int i=0;

while(i<1)

{

ZeroMemory(Buffer,sizeof(Buffer));

ReadFile(hFile,

Buffer,

sizeof(Buffer),

&dwBytesRead,

&ov);

WaitForSingleObject(hEndRead, INFINITE);

for (int j=0; j<9;j++)

{

jj[0]=Buffer[j];

y[i][j]=atoi(jj);

}

i++;

ov.Offset += 11;

}

CloseHandle(hFile);

}

// формирование Matrix

DWORD WINAPI Thread_One(LPVOID lpParameter)

{

// транспонирование вектора X

int m =9;

int n =1;

for (int i = 0; i<m; i++)

for (int j=0; j<n; j++)

tMatrix[i][j] = x[j][i];

int temp = n; n = m; m = temp;

// формирование матрицы

int i=0;

while(i<9)

{

for(int j=0;j<9;j++)

{

Matrix[i][j] = tMatrix[i][0]*y[0][j];

} i++;

}

return 1;

}

// определитель

DWORD WINAPI Thread_Two(LPVOID lpParameter)

{

int N=9;

for (int i = 0; i < N; i++)

for (int k = i + 1; k < N; k++)

avg+=(float)Matrix[k][i] / (N * N);

return 1;

}

// запись в файл

DWORD WINAPI Write(LPVOID lpParameter)

{

HANDLE hfile;

char Buffer[100];

DWORD dwByteWrite;

hfile=CreateFile("Result.txt",

GENERIC_WRITE,

FILE_SHARE_WRITE | FILE_SHARE_READ,

NULL,

CREATE_ALWAYS,

FILE_ATTRIBUTE_NORMAL,

NULL);

while(avg==0) Sleep(1);

ZeroMemory(Buffer,sizeof(Buffer));

sprintf(Buffer,"%f",avg);

WriteFile(hfile, Buffer, sizeof(Buffer), &dwByteWrite, NULL);

CloseHandle(hfile);

return 1;

}

int main(void)

{

DWORD h;

Thread_read_file_1=CreateThread(NULL,1,Read_file_1,NULL,0,&h);

Thread_read_file_2=CreateThread(NULL,1,Read_file_2,NULL,0,&h);

WaitForSingleObject(Thread_read_file_1, INFINITE);

WaitForSingleObject(Thread_read_file_2, INFINITE);

Thread_1=CreateThread(NULL,1,Thread_One,NULL,0,&h);

Thread_2=CreateThread(NULL,1,Thread_Two,NULL,0,&h);

Thread_write=CreateThread(NULL,1,Write,NULL,0,&h);

WaitForSingleObject(Thread_write, INFINITE);

printf("x:\n");

for(int i=0;i<1;i++)

{

for(int j=0;j<9;j++)

printf("%d ",x[i][j]);

printf("\n");

}

printf("xT:\n");

for(int i=0;i<9;i++)

{

for(int j=0;j<1;j++)

printf("%d ",tMatrix[i][j]);

printf("\n");

}

printf("y:\n");

for(int i=0;i<1;i++)

{

for(int j=0;j<9;j++)

printf("%d ",y[i][j]);

printf("\n");

}

printf("Matrix:\n");

for(int i=0;i<9;i++)

{

for(int j=0;j<9;j++)

printf("%d ",Matrix[i][j]);

printf("\n");

}

printf("avg:\n");

printf("%f",avg);

printf("\n");

CloseHandle(Thread_read_file_1);

CloseHandle(Thread_read_file_2);

CloseHandle(Thread_1);

CloseHandle(Thread_2);

CloseHandle(Thread_write);

fflush(stdin);

getchar();

return 0;

}

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

Выводы: получили навыки решения задач «поставщик – потребитель» с использованием асинхронного ввода/вывода. В данной лабораторной работе выполнение операции ввода/вывода происходит с ожиданием на объектах ядра. С помощью функции WaitForSingleObject происходит ожидание перевода события в сигнальное состояние, что означает завершение операции ввода/вывода.

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

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