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


Добавил:DMT
Дата создания:30 декабря 2007, 18:20
Дата обновления:30 декабря 2007, 18:20
Просмотров:5650 последний сегодня, 0:53
Комментариев: 1

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

up

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


Пользователь: ruslan
Сообщений: 23
Статус: Незримый
Зарегистрирован:
5 января 2008, 2:42
Был:29 января 2008, 21:23
ruslan
smsup
Дата: 12 января 2008, 1:17 Сообщение № 1
Код на C++
  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <iostream.h>
  4. #include <conio.h>
  5. #define N 5 //количество элементов
  6. struct arg //структура аргументов
  7. {
  8. int l,r;
  9. float rez;
  10. };
  11. float x[N]; //массив
  12. //----------------------------------------
  13. DWORD WINAPI multiply(void* s)
  14. {
  15. int i, l=((arg *)s)->l, r=((arg *)s)->r; //заполним переменные
  16. if (l==r)
  17. {
  18. ((arg *)s)->rez = x[l]; //результат
  19. }
  20. else
  21. {//в противном случае вызываем два потока с разными аргументами
  22. arg *r1 = new arg, *r2 = new arg;
  23. HANDLE H[2];
  24. r1->l=l; r1->r= (l+r+1)/2-1;
  25. r2->l=(l+r+1)/2; r2->r = r; //после этого создаём потоки
  26. H[0]= CreateThread(0,0,multiply,(void *)r1,0,0);
  27. H[1]= CreateThread(0,0,multiply,(void *)r2,0,0);
  28. WaitForMultipleObjects(2,H,true,INFINITE);
  29. ((arg *)s)->rez = r1->rez * r2->rez;
  30. delete r1; delete r2;
  31. }
  32. return 1; //всё прошло успешно
  33. }
  34. //----------------------
  35. float multiply0()
  36. {
  37. float m = 1;
  38. int i;
  39. for (i=0; i<N; i++)
  40. {
  41. m = m * x[i];
  42. }
  43. return m;
  44. }
  45. //-------------------------
  46. void main()
  47. {
  48. int i;
  49. randomize(); //инициализируем генератор случайных чисел
  50. for (i=0; i<N; i++){
  51. x[i]=((float)(10+random(80))/10);
  52. printf("%.2f ",x[i]);
  53. }
  54. arg t;
  55. t.l = 0; t.r = N-1;
  56. multiply(&t); //находим минальный элемент в потоках
  57. cout << "\n multiply: "<< t.rez;
  58. cout << "\n check multiply: "<< multiply0(); //проверка
  59. getch();
  60. }
  61. //----------------------------
При использовании обязательна ссылка на http://DMTSoft.ru