Программа загружающая потоки - реализующая волновую систему xn=exp(sin(un)), yn=sin(un*vn)


Добавил:DMT
Дата создания:23 апреля 2008, 20:28
Дата обновления:23 апреля 2008, 20:29
Просмотров:9313 последний позавчера, 16:58
Комментариев: 0

Программа загружающая потоки - реализующая волновую систему ,


Теория:

Сеть Петри для данной задачи:

Сеть Петри состоит из 8 мест и 7 переходов. Для решения данной задачи надо создать 4 несинхронных потока, каждый из потоков будет работать параллельно и ожидать поступления данных в канал.

Канал будет состоять из 7 мест.

Текст программы без использования параллельных потоков:

Код на C++
  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <dos.h>
  5. #include <iostream.h>
  6. #include <conio.h>
  7. #include <math.h>
  8.  
  9. #define n 20
  10.  
  11. // класс каналов
  12. class channel
  13. {
  14. // буфер для передачи данных
  15. double *buf;
  16. // размер буфера
  17. int size;
  18. // семафоры
  19. HANDLE s, empty, full;
  20. // указатели для чтения и записи
  21. int countr, countw;
  22. public:
  23. // конструктор
  24. channel (int nn): size(nn)
  25. {
  26. // память для буфера
  27. buf = new double[nn];
  28. countr = 0;
  29. countw = 0;
  30. // создание семафоров
  31. s = CreateSemaphore(NULL, 1, 1, NULL);
  32. empty = CreateSemaphore(NULL, nn, nn, NULL);
  33. full = CreateSemaphore(NULL, 0, nn, NULL);
  34. }
  35. // операция записи в канал
  36. void operator << (double d)
  37. {
  38. // ожидание свободных мест
  39. WaitForSingleObject(empty, INFINITE);
  40. WaitForSingleObject(s, INFINITE);
  41. // запись в очередь
  42. buf[countw++] = d;
  43. if (countw==size)
  44. countw = 0;
  45. ReleaseSemaphore(s, 1, NULL);
  46. ReleaseSemaphore(full, 1, NULL);
  47. }
  48. // операция чтения из канала
  49. void operator >> (double& d)
  50. {
  51. // ожидание данных
  52. WaitForSingleObject(full, INFINITE);
  53. WaitForSingleObject(s, INFINITE);
  54. // чтение из циклической очереди
  55. d = buf[countr];
  56. countr++;
  57. if (countr == size)
  58. countr = 0;
  59. ReleaseSemaphore(s, 1, NULL);
  60. ReleaseSemaphore(empty, 1, NULL);
  61. }
  62. };
  63.  
  64. channel *pc[7];
  65. DWORD WINAPI mult(LPVOID);
  66. DWORD WINAPI sint1(LPVOID);
  67. DWORD WINAPI sint2(LPVOID);
  68. DWORD WINAPI expt(LPVOID);
  69.  
  70. void main()
  71. {
  72. channel c[7] =
  73. {
  74. 10, 10, 10, 10, 10, 10, 10
  75. };
  76. // инициализация каналов, каждый из них состоит из 10 элементов
  77.  
  78.  
  79. // указание на каналы
  80. for (int i = 0; i < 7; i++)
  81. pc[i] = &c[i];
  82. // запуск потоков
  83. CreateThread(NULL, 0, mult, 0, 0, 0);
  84. CreateThread(NULL, 0, sint1, 0, 0, 0);
  85. CreateThread(NULL, 0, sint2, 0, 0, 0);
  86. CreateThread(NULL, 0, expt, 0, 0, 0);
  87.  
  88.  
  89. double u, v, x, y;
  90. for (int i = 0; i < n; i++)
  91. {
  92. u = i; v = i + 1;
  93. c[0] << u;
  94. c[1] << v;
  95. c[4] << u;
  96. }
  97. cout << " \t x \t\t y \n";
  98. for (int i = 0; i < n; i++)
  99. {
  100. c[3] >> y;
  101. c[6] >> x;
  102. cout << "\t" << x
  103. << "\t\t" << y
  104. << endl;
  105. }
  106. getch();
  107. return;
  108. }
  109.  
  110. //Поток для умножения
  111. DWORD WINAPI mult(LPVOID)
  112. {
  113. double a1, a2;
  114. for (int i = 0; i < n; i++)
  115. {
  116. *pc[0] >> a1;
  117. *pc[1] >> a2;
  118. *pc[2] << (a1 * a2);
  119. }
  120. return 1;
  121. }
  122.  
  123. //Поток для вычисления синуса
  124. DWORD WINAPI sint1(LPVOID)
  125. {
  126. double a1;
  127. for (int i = 0; i < n; i++)
  128. {
  129. *pc[2] >> a1;
  130. *pc[3] << sin(a1);
  131. }
  132. return 1;
  133. }
  134.  
  135. //Поток для вычисления синуса
  136. DWORD WINAPI sint2(LPVOID)
  137. {
  138. double a1;
  139. for (int i = 0; i < n; i++)
  140. {
  141. *pc[4] >> a1;
  142. *pc[5] << sin(a1);
  143. }
  144. return 1;
  145. }
  146.  
  147. // поток для вычисления экспоненты
  148. DWORD WINAPI expt(LPVOID)
  149. {
  150. double a1;
  151. for (int i = 0; i < n; i++)
  152. {
  153. *pc[5] >> a1;
  154. *pc[6] << exp(a1);
  155. }
  156. return 1;
  157. }
При использовании обязательна ссылка на http://DMTSoft.ru
up