Потоки и проблема сериализации

Автор: a**************@yandex.ru, 27 Ноября 2011 в 07:03, лабораторная работа

Описание работы

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

Работа содержит 1 файл

Лабораторная работа 3.doc

— 43.50 Кб (Скачать)

Тема:  Потоки и проблема сериализации.

        Цель: Научиться создавать многопоточные приложения.

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

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

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

 

    Числа a[i], b[i]  будем вводить с помощью генератора целых чисел, полагая a[i] = rand()%1000, b[i] = rand()%1000. Разработаем подпрограмму (функцию) потока. Она будет вычислять max(s,s1). Это вычисление производится со случайной задержкой с помощью вызова функции Sleep(rand()%200).

    Подпрограмма  имеет один параметр k, который будет  передаваться в нее через LPVOID ps. Затем  подпрограмма захватывает с помощью  семафора внешнюю переменную s, в  которой храниться максимальное значение, сравнивает это число с вычисленным в потоке числом s1, записывает в s максимальное из этих двух чисел и освобождает переменную s. Главная программа ожидает выполнения всех n потоков с помощью оператора while (j < n). Для проверки вычисленного значения приведём функцию, вычисляющую это значение с помощью одного цикла. 

    Исходный  код программы 

    #include <windows.h>         

    #include <stdlib.h>          // содержит описание rand()

    #include <time.h>            

    #include <iostream.h>         // ввод-вывод 

    #define Z 2 

    volatile int j=0;             // для проверки в цикле while(j<n) 

    HANDLE mut;                   // семафор 

    double s=0,s1=0;                 

    double a[Z], b[Z];             

    DWORD WINAPI maxim(LPVOID ps)   // функция потоков

    { 

          int *k = (int *)ps;

          Sleep(rand()%200);

        s1 = a[*k]-b[*k];

          WaitForSingleObject(mut, INFINITE); // ждем освобождения s

          s = max(s,s1);                  

          //cout << "\nOwned by " << *k+1;

          ReleaseSemaphore(mut,1,NULL);     // освобождаем s

          j++;

          return 1;

    } 

    double maxi()                      // простая функция

    {

    int s0=-100,s1=0, k; 

    for (k=0; k<Z; k++)              

          {

                s1 = a[k]-b[k];

                s0 = max(s0,s1);

          };

          return s0;

    } 
 

    void main(void)

    {

          int i; int p[Z];

          srand( (unsigned)time( NULL ) );

            for(i=0; i<Z; i++)

            {

                    a[i] = rand()%1000;

                    b[i] = rand()%1000;

            }

            // генерация случайного числа

                s=a[0]-b[0];

          for(i=0; i<Z; i++) p[i]=i;              // для передачи номера потока

          mut = CreateSemaphore(NULL,1,1,NULL);   // создание семафора

          for(i=0; i<Z; i++)                      // запуск потоков

          {

                CreateThread(NULL,0,maxim, (void *) (&p[i]),0,0);

          }

    while (j<Z-1);                       // ожидание завершения всех потоков

    cout << "\nValue obtained by threads = " << s; // результат вычисления

    cout << "\nValue of the simple subprogram = " << maxi()<<"\n\n";

                                                   // с помощью потоков

                                                   // и простой функции

    } 
 

    Результат работы программы 

 
 
 
 
 
 
 
 
 

 

Список  использованных источников 

    
  1. Воеводин, В.В. Математические модели и методы в параллельных процессах. // В.В Воеводин – М.: Наука, 1986. – 296 с.
  2. Майерс, Г. Архитектура современных ЭВМ: В 2-кн. Кн.1. // Г. Майерс – М.: Мир, 1985. – 364 с. Кн.2. – М.: Мир, 1985. – 312 с.
  3. Трахтенгерц, Э.А. Введение в теорию анализа и распараллеливания программ ЭВМ в процессе трансляции. // Э.А. Трахтенгерц– М.: Наука, 1981. – 256 с.

Информация о работе Потоки и проблема сериализации