Министерство образования и науки Российской Федерации
Комсомольский-на-Амуре государственный
технический университет
Факультет компьютерных технологий
Кафедра МОПЭВМ
По дисциплине «Параллельное программирование».
Выполнил: Киселевский М.Е.
Группа: 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 с.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.