Вопрос 1. Разработать многопоточную программу, реализующую конвейерную систему потоков, для вычисления векторной операции


Добавил:DMT
Дата создания:30 декабря 2007, 18:16
Дата обновления:31 января 2008, 12:41
Просмотров:7257 последний сегодня, 2:07
Комментариев: 1

Вопрос 1. Разработать многопоточную программу, реализующую конвейерную систему потоков, для вычисления векторной операции .

up

Комментарии для "Вопрос 1. Разработать многопоточную программу, реализующую конвейерную систему потоков, для вычисления векторной операции"


Пользователь: kate
Сообщений: 9
Статус: Незримый
Зарегистрирован:
4 января 2008, 14:05
Был:28 января 2008, 21:05
kate
smsup
Дата: 4 января 2008, 14:27 Сообщение № 1
Код на C
  1. #include <windows.h>
  2. //стандартный заголовочный файл windows
  3. #include <stdlib.h> //стандартная библиотека
  4. #include <time.h>
  5. //библиотека функций для работы со временем
  6. #include <iostream.h>//потоковый ввод-вывод
  7. #include <conio.h> //консольный ввод-вывод
  8. #include <dos.h> //функций дос
  9. #include <math.h>
  10. //библиотека для работы с математическими функциями
  11. #define n 30 //количество потоков
  12. HANDLE T1, T2, T3; //хэндлы потоков
  13. HANDLE ready_x, ready_y, ready_z,
  14. free_x, free_y, free_z; //события
  15. double x, y, z;
  16. double a[n], b[n];
  17. volatile int jout=0;
  18. //первый поток
  19. DWORD WINAPI Th1(LPVOID)
  20. {
  21. double w;
  22. for (;;)
  23. {
  24. WaitForSingleObject(ready_x,INFINITE); //ждём х
  25. w=1+sin(x);
  26. SetEvent(free_x); //х - свободно
  27. WaitForSingleObject(free_y,INFINITE); //ждём у
  28. y=w;
  29. SetEvent(ready_y); //у-готово
  30. }
  31. }
  32. DWORD WINAPI Th2(LPVOID) //второй поток
  33. {
  34. double w;
  35. for (;;)
  36. {
  37. WaitForSingleObject(ready_y,INFINITE); //ждём у
  38. w=cos(y);
  39. SetEvent(free_y); //у-свободно
  40. WaitForSingleObject(free_z,INFINITE); //ждём z
  41. z=w;
  42. SetEvent(ready_z); //z готово
  43. }
  44. }
  45. DWORD WINAPI Th3(LPVOID)
  46. {
  47. double w;
  48. for (;;)
  49. {
  50. WaitForSingleObject(ready_z,INFINITE);//ждём z
  51. b[jout++]=z;
  52. SetEvent(free_z); //z свободно
  53. }
  54. }
  55. void main()
  56. {
  57. int i;
  58. randomize();
  59. //инициализируем генератор случайных чисел
  60. for (i=0; i<n; i++) a[i]=0.1*i;
  61. T1 = CreateThread(NULL,0,Th1,NULL,0,0); //создаём потоки
  62. T2 = CreateThread(NULL,0,Th2,NULL,0,0);
  63. T3 = CreateThread(NULL,0,Th3,NULL,0,0);
  64. //устанавливаем события
  65. ready_x = CreateEvent(NULL,FALSE,FALSE,NULL);
  66. ready_y = CreateEvent(NULL,FALSE,FALSE,NULL);
  67. ready_z = CreateEvent(NULL,FALSE,FALSE,NULL);
  68. free_x = CreateEvent(NULL,FALSE,TRUE,NULL);
  69. free_y = CreateEvent(NULL,FALSE,TRUE,NULL);
  70. free_z = CreateEvent(NULL,FALSE,TRUE,NULL);
  71. for (i=0; i<n; i++)
  72. {
  73. WaitForSingleObject(free_x,INFINITE); //ждём х
  74. x=a[i];
  75. SetEvent(ready_x); //х готово
  76. }
  77. while(jout<n); //ждём завершения вычислений
  78. for (i=0; i<n; i++) {//выводим результаты
  79. if (i%2==0) cout<<"\n"; cout << " b["<<i<<"]="<< b[i]
  80. <<"== "<< cos(1+sin(a[i])) ;
  81. }
  82. getch();
  83. //ждём нажатия клавиши пользователем
  84. }
При использовании обязательна ссылка на http://DMTSoft.ru



Отредактированно DMT.
kate - используйте тег форматирования CODE для оформления кода