Сеть Петри для волновой системы будет иметь следующий вид:
Код на C++ //--------------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused #include <windows.h> #include <stdlib.h> #include <time.h> #include <dos.h> #include <iostream.h> #include <conio.h> #include <math.h> #define n 20 class channel // класс каналов { double *buf; // буфер для передачи данных int size; // размер буфера HANDLE s, empty, // семафоры full; int countr, countw; // указатели для чтения и записи public: channel (int nn): size(nn) // конструктор { buf = new double[nn]; // память для буфера countr=0; countw=0; s=CreateSemaphore(NULL,1,1,NULL); // создание семафоров empty=CreateSemaphore(NULL,nn,nn,NULL); full = CreateSemaphore(NULL,0,nn,NULL); } void operator << (double d) // операция записи в канал { WaitForSingleObject(empty, INFINITE); // ожидание свободных мест WaitForSingleObject(s, INFINITE); buf[countw++]=d; // запись в очередь if (countw==size) countw=0; ReleaseSemaphore(s,1,NULL); ReleaseSemaphore(full,1,NULL); // увеличение числа запи-сей } void operator >> (double& d) // операция чтения из канала { WaitForSingleObject(full, INFINITE); // ожидание данных WaitForSingleObject(s, INFINITE); d = buf[countr]; countr++; // чтение из циклической очереди if (countr==size) countr = 0; ReleaseSemaphore(s,1,NULL); ReleaseSemaphore(empty,1,NULL); // увеличение числа свободных мест } }; //--------------------------------------------------------------------------- channel *pc[10]; DWORD WINAPI cosin1(LPVOID) { int j; double d; for (j=0; j<n; j++) { *pc[0]>>d; // прием данных из канала 0 *pc[3]<<cos(d); // умножение и отправление в канал 4 } return 1; } //--------------------------------------------------------------------------- DWORD WINAPI sinus1(LPVOID) { int j; double d; for (j=0; j<n; j++) { *pc[1]>>d; // прием данных из канала 1 *pc[4]<<sin(d); // передача в канал 4 } return 1; } //--------------------------------------------------------------------------- DWORD WINAPI cosin2(LPVOID) // второй поток для вычисления косинуса { int j; double d; for (j=0; j<n; j++) { *pc[2]>>d; // прием из канала 2 *pc[5]<<cos(d); // передача в канал 5 } return 1; } //--------------------------------------------------------------------------- DWORD WINAPI plus1(LPVOID) // первый поток для вычисления суммы { int j; double d1,d2; for (j=0; j<n; j++) { *pc[3]>>d1;*pc[4]>>d2; // прием из каналов 3 и 4 *pc[6]<<(d1+d2); // передача в канал 8 } return 1; } //--------------------------------------------------------------------------- DWORD WINAPI sin2(LPVOID) // второй поток для вычисления синуса { int j; double d; for (j=0; j<n; j++) { *pc[5]>>d; // прием из канала 5 *pc[7]<<sin(d); // передача в канал 7 } return 1; } //--------------------------------------------------------------------------- DWORD WINAPI expo(LPVOID) // поток для вычисления экспоненты { int j; double d; for (j=0; j<n; j++) { *pc[6]>>d; // прием из канала 8 *pc[8]<<exp(d); // передача в канал 10 } return 1; } //--------------------------------------------------------------------------- DWORD WINAPI plus2(LPVOID) // воторой поток для вычисления суммы { int j; double d1,d2; for (j=0; j<n; j++) { *pc[7]>>d1;*pc[8]>>d2; // прием из каналов 7 и 8 *pc[9]<<(d1+d2); // передача в канал 9 } return 1; } //--------------------------------------------------------------------------- void main() // главный поток { channel c[10]={10,10,10,10,10,10,10,10,10,10}; // инициализация каналов int i; // каждый из них состоит из 10 элементов for (i=0; i<10;i++) pc[i] = &c[i]; // указатели на каналы CreateThread(NULL,0,cosin1,0,0,0); // запуск потоков CreateThread(NULL,0,sinus1,0,0,0); CreateThread(NULL,0,cosin2,0,0,0); CreateThread(NULL,0,plus1,0,0,0); CreateThread(NULL,0,sin2,0,0,0); CreateThread(NULL,0,expo,0,0,0); CreateThread(NULL,0,plus2,0,0,0); double u,v,z; for (i=0; i<n; i++) { u=i; v=i+1; c[0]<<v; // запись в каналы 0,1,2 c[1]<<u; c[2]<<u; } for (i=0; i<n; i++) { c[9]>>z; cout<<"\n"<<z; // чтение и вывод результатов cout<<"=="; cout<<(double)(exp(sin(i)+cos(i+1))+sin(cos(i))); // сравнение со значениями } getch(); } //---------------------------------------------------------------------------
|