Разработка программы, загружающей потоки, реализующие волновую систему

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

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

Министерство образования и науки Российской Федерации

Комсомольский-на-Амуре государственный

технический университет

Факультет компьютерных технологий

Кафедра МОПЭВМ

Лабораторная работа №4.

По дисциплине «Параллельное программирование».

Выполнил: Киселевский М.Е.

Группа: 4ВС-1

Проверил: Хусаинов А.А

Комсомольск-на-Амуре

2007


Задание

Вариант 7

Разработать программу, загружающую потоки, реализующие волновую систему. Привести сеть Петри этой волновой системы.

Управление потоками осуществляется с помощью событий.

,                     .

Сеть Петри.


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

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <math.h>

#include <windows.h>

#define n 7

HANDLE hmul,hcos1,hcos2,hexp,hx,hy, hinit;

// хендлы событий

HANDLE hEv0_w, hEv1_w, hEv2_w, hEv3_w, hEv4_w, hEv5_w, hEv6_w, hEv7_w;

HANDLE hEv0_r, hEv1_r, hEv2_r, hEv3_r, hEv4_r, hEv5_r, hEv6_r, hEv7_r;

float u[n], v[n]; // массивы   исходных данных

float x[n], y[n]; // массивы выходных данных

volatile int ix=0;

volatile int iy=0;

float tmp[7];

FILE *out;

DWORD WINAPI Mul(LPVOID)

{

for(;;)

{

WaitForSingleObject(hEv4_r,INFINITE); //ожидание первого аргумента умножения

WaitForSingleObject(hEv5_r,INFINITE); //ожидание второго аргумента умножения

float t=tmp[4]*tmp[5];

SetEvent(hEv4_w);

SetEvent(hEv5_w);

WaitForSingleObject(hEv7_w,INFINITE); //ожидание события на возможность записи результата

tmp[7]=t;

SetEvent(hEv7_r);

}

return 1;

}

DWORD WINAPI Cos1(LPVOID)

{

for(;;)

{

WaitForSingleObject(hEv1_r,INFINITE); //ожидание первого аргумента умножения

WaitForSingleObject(hEv2_r,INFINITE); //ожидание второго аргумента умножения

float t=cos(tmp[1]-tmp[2]);

SetEvent(hEv1_w);

SetEvent(hEv2_w);

WaitForSingleObject(hEv6_w,INFINITE); //ожидание события на возможность записи результата

tmp[6]=t;

SetEvent(hEv6_r);

}

return 1;

}

DWORD WINAPI XReady(LPVOID)

{

for(;;)

{

WaitForSingleObject(hEv7_r,INFINITE);

x[ix]=tmp[7];

ix++;

SetEvent(hEv7_w);

}

return 1;

}

DWORD WINAPI Cos2(LPVOID)

{

for(;;)

{

WaitForSingleObject(hEv3_r,INFINITE);

float t=cos(tmp[3]);

SetEvent(hEv3_w);

WaitForSingleObject(hEv5_w,INFINITE);

tmp[5]=t;

SetEvent(hEv5_r);

}

return 1;

}

DWORD WINAPI Exp(LPVOID)

{

for(;;)

{

WaitForSingleObject(hEv0_r,INFINITE);

float t=exp(tmp[0]);

SetEvent(hEv0_w);

WaitForSingleObject(hEv4_w,INFINITE);

tmp[4]=t;

SetEvent(hEv4_r);

}

return 1;

}

DWORD WINAPI YReady(LPVOID)

{

for(;;)

{

WaitForSingleObject(hEv6_r,INFINITE);

y[iy]=tmp[6];

iy++;

SetEvent(hEv6_w);

}

return 1;

}

void main()

{

//            clrscr();

int i=0;

for(i=0;i<n;i++)

{

u[i]=rand()%(20)+1.2;

v[i]=rand()%(20)+0.6;

}

// hinit=CreateThread(NULL,0,Init,NULL,0,0);

// создание событий

hEv0_r=CreateEvent(NULL,FALSE,FALSE,NULL);

hEv1_r=CreateEvent(NULL,FALSE,FALSE,NULL);

hEv2_r=CreateEvent(NULL,FALSE,FALSE,NULL);

hEv3_r=CreateEvent(NULL,FALSE,FALSE,NULL);

hEv4_r=CreateEvent(NULL,FALSE,FALSE,NULL);

hEv5_r=CreateEvent(NULL,FALSE,FALSE,NULL);

hEv6_r=CreateEvent(NULL,FALSE,FALSE,NULL);

hEv7_r=CreateEvent(NULL,FALSE,FALSE,NULL);

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

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

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

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

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

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

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

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

// создание потоков

hmul=CreateThread(NULL,0,Mul,NULL,0,0);

hcos1=CreateThread(NULL,0,Cos1,NULL,0,0);

hcos2=CreateThread(NULL,0,Cos2,NULL,0,0);

hexp=CreateThread(NULL,0,Exp,NULL,0,0);

hx=CreateThread(NULL,0,XReady,NULL,0,0);

hy=CreateThread(NULL,0,YReady,NULL,0,0);

for(i=0;i<n;i++)

{

WaitForSingleObject(hEv0_w,INFINITE);

tmp[0]=u[i];

SetEvent(hEv0_r);

WaitForSingleObject(hEv1_w,INFINITE);

tmp[1]=u[i];

SetEvent(hEv1_r);

WaitForSingleObject(hEv2_w,INFINITE);

tmp[2]=v[i];

SetEvent(hEv2_r);

WaitForSingleObject(hEv3_w,INFINITE);

tmp[3]=v[i];

SetEvent(hEv3_r);

}

while((ix<n)||(iy<n));

out=fopen("D:\\rez.txt","w+");

printf("\n************Start data************\n");

fprintf(out,"\n************Start data************\n");

for(i=0;i<n;i++)

{

fprintf(out,"\nu[%d]=%f\tv[%d]=%f",i,u[i],i,v[i]);

printf("\nu[%d]=%f\tv[%d]=%f",i,u[i],i,v[i]);

}

printf("\n************Result************\n");

fprintf(out,"\n************Result************\n");

for(i=0;i<n;i++)

{

fprintf(out,"\nx[%d]=%f\ty[%d]=%f",i,x[i],i,y[i]);

printf("\nx[%d]=%f\ty[%d]=%f",i,x[i],i,y[i]);

}

printf("\n\n\t\tDONE!!!");

fprintf(out,"\n\n\t\tDONE!!!");

fclose(out);

getch();

}


Результат работы программы

Список использованной литературы

1. Архитектура вычислительных систем: Учеб. пособие / А.А. Хусаинов, Н.Н. Михайлова. – Комсомольск-на-Амуре: Государственное образовательное учреждение высшего профессионального образования «Комсомольский-на-Амуре гос. техн. ун-т», 2004. – 123  с.

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

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

Тип:
Отчеты по лабораторным работам
Размер файла:
61 Kb
Скачали:
0