Автор работы: Пользователь скрыл имя, 26 Ноября 2011 в 13:09, лабораторная работа
Задание: Разработать многопотоковую программу для вычисления . Недостающие данные можно вводить с помощью генератора случайных чисел. Число определяется с помощью директивы #define.
Программа должна запускать  потоков. Параллельные вычисления в потоках производятся с небольшими случайными задержками.
Тема: Потоки и проблема сериализации.
Цель: Научиться создавать многопоточные приложения.
Задание: Разработать многопотоковую программу для вычисления . Недостающие данные можно вводить с помощью генератора случайных чисел. Число определяется с помощью директивы #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<
    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(
s = max(s,s1);
//cout << "\nOwned by " << *k+1;
          ReleaseSemaphore(
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(
}
    while 
(j<Z-1);                       
// ожидание завершения всех 
cout << "\nValue obtained by threads = " << s; // результат вычисления
cout << "\nValue of the simple subprogram = " << maxi()<<"\n\n";
                              
                              
    } 
 
    Результат 
работы программы 
 
Список 
использованных источников