Код на C++ #include <windows.h> #include <stdlib.h> #include <time.h> #include <dos.h> #include <iostream.h> #include <conio.h> #include <math.h> #define n 40 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[14]; DWORD WINAPI plus(LPVOID) // поток для сложения { int j; double d1,d2; for (j=0; j<n; j++) // цикл { *pc[3]>>d1;*pc[1]>>d2; // прием данных из каналов 3 и 1 *pc[7]<<(d1+d2); // передача суммы в канал 7 } return 1; } DWORD WINAPI cosinus(LPVOID) // поток для вычисления косинуса { int j; double d2; for (j=0; j<n; j++) // цикл { *pc[7]>>d2; // прием из канала 7 *pc[8]<<cos(d2); // передача в канал 8 } return 1; } DWORD WINAPI plus2(LPVOID) // поток для сложения { int j; double d1,d2; for (j=0; j<n; j++) // цикл { *pc[4]>>d1;*pc[8]>>d2; // прием данных из каналов 4 и 8 *pc[10]<<(d1+d2); // передача суммы в канал 10 } return 1; } DWORD WINAPI sinus(LPVOID) // поток для вычисления синуса { int j; double d2; for (j=0; j<n; j++) // цикл { *pc[5]>>d2; // прием из канала 5 *pc[9]<<sin(d2); // передача в канал 9 } return 1; } DWORD WINAPI mult(LPVOID) // поток для умножения { int j; double d1, d2; for (j=0; j<n; j++) // цикл { *pc[9]>>d1; *pc[10]>>d2; // прием данных из каналов 9 и 10 *pc[12]<<(d1*d2); // умножение и отправление в канал 12 } return 1; } DWORD WINAPI sinus2(LPVOID) // поток для вычисления синуса { int j; double d2; for (j=0; j<n; j++) // цикл { *pc[0]>>d2; // прием из канала 0 *pc[6]<<sin(d2); // передача в канал 6 } return 1; } DWORD WINAPI mult2(LPVOID) // поток для умножения { int j; double d1, d2; for (j=0; j<n; j++) // цикл { *pc[2]>>d1; *pc[6]>>d2; // прием данных из каналов 2 и 6 *pc[11]<<(d1*d2); // умножение и отправление в канал 11 } return 1; } DWORD WINAPI plus3(LPVOID) // поток для сложения { int j; double d1,d2; for (j=0; j<n; j++) // цикл { *pc[12]>>d1;*pc[11]>>d2; // прием данных из каналов 12 и 11 *pc[13]<<(d1+d2); // передача суммы в канал 13 } return 1; } void main() // главный поток { channel c[14]={13,13,13,13,13,13,13,13,13,13,13,13,13,13}; // инициализация каналов int i; // каждый из них состоит из 10 элементов for (i=0; i<14;i++) pc[i] = &c[i]; // указатели на каналы // запуск потоков CreateThread(NULL,0,plus,0,0,0); CreateThread(NULL,0,cosinus,0,0,0); CreateThread(NULL,0,plus2,0,0,0); CreateThread(NULL,0,sinus,0,0,0); CreateThread(NULL,0,mult,0,0,0); CreateThread(NULL,0,sinus2,0,0,0); CreateThread(NULL,0,mult2,0,0,0); CreateThread(NULL,0,plus3,0,0,0); double x,y,z; for (i=0; i<n; i++) { x=i; y=i+1; c[0]<<y; c[1]<<y; // запись в каналы 0,1,2,3,4,5 c[2]<<x; c[3]<<x; c[4]<<x; c[5]<<x; } for (i=0; i<n; i++) { c[13]>>z; cout<<"\n"<<z; // чтение и вывод результатов cout<<"=="; cout<<(double)(i*sin(i+1)+sin(i)*(i+cos(i+i+1))) ; // сравнение со значениями } getch(); }
|