Программа загружающая потоки - реализующая волновую систему ,
Теория:
Сеть Петри для данной задачи:
Сеть Петри состоит из 8 мест и 7 переходов. Для решения данной
задачи надо создать 4 несинхронных потока, каждый из потоков будет работать
параллельно и ожидать поступления данных в канал.
Канал будет состоять из 7 мест.
Текст программы без использования параллельных потоков:
Код на 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[7]; DWORD WINAPI mult(LPVOID); DWORD WINAPI sint1(LPVOID); DWORD WINAPI sint2(LPVOID); DWORD WINAPI expt(LPVOID); void main() { channel c[7] = { 10, 10, 10, 10, 10, 10, 10 }; // инициализация каналов, каждый из них состоит из 10 элементов // указание на каналы for (int i = 0; i < 7; i++) pc[i] = &c[i]; // запуск потоков CreateThread(NULL, 0, mult, 0, 0, 0); CreateThread(NULL, 0, sint1, 0, 0, 0); CreateThread(NULL, 0, sint2, 0, 0, 0); CreateThread(NULL, 0, expt, 0, 0, 0); double u, v, x, y; for (int i = 0; i < n; i++) { u = i; v = i + 1; c[0] << u; c[1] << v; c[4] << u; } cout << " \t x \t\t y \n"; for (int i = 0; i < n; i++) { c[3] >> y; c[6] >> x; cout << "\t" << x << "\t\t" << y << endl; } getch(); return; } //Поток для умножения DWORD WINAPI mult(LPVOID) { double a1, a2; for (int i = 0; i < n; i++) { *pc[0] >> a1; *pc[1] >> a2; *pc[2] << (a1 * a2); } return 1; } //Поток для вычисления синуса DWORD WINAPI sint1(LPVOID) { double a1; for (int i = 0; i < n; i++) { *pc[2] >> a1; *pc[3] << sin(a1); } return 1; } //Поток для вычисления синуса DWORD WINAPI sint2(LPVOID) { double a1; for (int i = 0; i < n; i++) { *pc[4] >> a1; *pc[5] << sin(a1); } return 1; } // поток для вычисления экспоненты DWORD WINAPI expt(LPVOID) { double a1; for (int i = 0; i < n; i++) { *pc[5] >> a1; *pc[6] << exp(a1); } return 1; }
|