Многопотоковая программа для вычисления заданного логического выражения - интеграла sin(x)


Добавил:DMT
Дата создания:23 апреля 2008, 20:03
Дата обновления:23 апреля 2008, 20:11
Просмотров:8317 последний позавчера, 0:41
Комментариев: 1

Написать многопотоковую программу для вычисления заданного логического выражения, состоящего из поразрядных операций, арифметического выражения или приближенного значения интеграла. Недостающие данные можно вводить с помощью генератора случайных чисел. Число определяется с помощью директивы # define .

Программа запускает потоков. Параллельные вычисления в потоках производятся с небольшими случайными задержками.

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


Теория:

Функция CreateThread Создает в памяти пространство для запуска процессом еще одной поточной функции
Код на C++
  1.  
  2. HANDLE CreateThread(
  3. LPSECURITY_ATTRIBUTES lpThreadAttributes <>, // SD
  4. DWORD dwStackSize <>, // initial stack size
  5. LPTHREAD_START_ROUTINE lpStartAddress <>, // Поточная функция
  6. LPVOID lpParameter, // Указатель на аргументы поточной функции
  7. DWORD dwCreationFlags <>, // creation option
  8. LPDWORD lpThreadId <> // thread identifier
  9. );
При использовании обязательна ссылка на http://DMTSoft.ru

Функция CreateMutex Регистрирует в системе объект Мъютекс , нужный для синхронизации параллельных процессов.

Код на C++
  1. HANDLE CreateMutex(
  2. LPSECURITY_ATTRIBUTES lpMutexAttributes <>, // SD
  3. BOOL bInitialOwner <>, // initial owner
  4. LPCTSTR lpName <> // object name
  5. );
При использовании обязательна ссылка на http://DMTSoft.ru

Функция CreateSemaphore регестрирует в системе объект Семафор, который, также как и мьютекс , помогает синхронизировать параллельные процессы.

Код на C++
  1. HANDLE CreateSemaphore(
  2. LPSECURITY_ATTRIBUTES lpSemaphoreAttributes <>, // SD
  3. LONG lInitialCount <>, // initial count
  4. LONG lMaximumCount <>, // maximum count
  5. LPCTSTR lpName <> // object name
  6. );
При использовании обязательна ссылка на http://DMTSoft.ru

Описание программы:

Программа с помощью цикла запускает n потоков, которые начинают вычислять значение определенного интеграла по заданной формуле, главный поток ожидает завершения вычислений всеми потоками и затем выводит значение вычислений на экран. Потоки, работая параллельно, используют мьютекс для синхронизации вывода в переменную.

Для проверки, создана еще одна программа, без использования параллельных потоков.

Текст программы
Код на C++
  1. #include <iostream.h>
  2. #include <math.h>
  3. #include <conio.h>
  4. #include <graphics.h>
  5.  
  6. const int n = 100;
  7. const float Pi =3.1415;
  8. volatile double sum;
  9. volatile int counter;
  10. DWORD WINAPI ThreadSin(void *p);
  11.  
  12. int main()
  13. {
  14. sum = 0;
  15. counter = 0;
  16. int * r;
  17. for (int k = 0; k < n; k++)
  18. {
  19. r = new int;
  20. *r = k;
  21. CreateThread(NULL, 0, ThreadSin, (void *)r, 0, NULL);
  22. }
  23. while (counter < n);
  24. cout << " x\n"<< "Integrall(sin(x) dx) ---> " << sum << "\n 0\n";
  25. cin.get();
  26. return 1;
  27. }
  28.  
  29. DWORD WINAPI ThreadSin(void *p)
  30. {
  31. Sleep(rand() / 10);
  32.  
  33. HANDLE mut = CreateMutex(NULL, FALSE, "SinMutex");
  34.  
  35. double iter;
  36. int r = *(int *)p;
  37. iter = (Pi / n) * sin((Pi * r) / n);
  38.  
  39. // Ждём получения мьютекса
  40. WaitForSingleObject(mut, INFINITE);
  41. sum += iter;
  42. counter++;
  43.  
  44. // Освобождаем мьютекс
  45. ReleaseMutex(mut);
  46. return 0;
  47. }
При использовании обязательна ссылка на http://DMTSoft.ru
Код на C++
  1. #include <iostream>
  2. #include <math.h>
  3.  
  4. const int n = 100;
  5. const float Pi =3.1415;
  6.  
  7. void main()
  8. {
  9. double sum = 0;
  10. for (int k = 0; k < n; k++)
  11. {
  12. sum += (Pi / n) * sin((Pi * k) / n );
  13. }
  14. cout << " x\n"<< "Integrall(sin(x) dx) ---> " << sum << "\n 0\n";
  15. cin.get();
  16. }
При использовании обязательна ссылка на http://DMTSoft.ru
up

Комментарии для "Многопотоковая программа для вычисления заданного логического выражения - интеграла sin(x)"


Пользователь: *kristina*
Сообщений: 1
Статус: Незримый
Зарегистрирован:
17 декабря 2014, 18:44
Был:22 декабря 2014, 5:15
*kristina*
smsup
Дата: 17 декабря 2014, 18:47 Сообщение № 1
Как модифиуировать программу чтобы можно было задавать количество отрезков отдельной пременной?