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