Автор: a**************@yandex.ru, 27 Ноября 2011 в 07:03, лабораторная работа
Цель: Научиться создавать многопоточные приложения.
Задание: Разработать многопотоковую программу для вычисления . Недостающие данные можно вводить с помощью генератора случайных чисел. Число определяется с помощью директивы #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";
}
Результат
работы программы
Список
использованных источников