Использование программного интерфейса Win API. Синхронизация процессов и потоков в ОС Windows
Изучение программного интерфейса приложений (API) операционных систем. Разработка программы Sort3, реализующей алгоритм заполнения массива целыми числами и его сортировка. Исследование механизма критических секций с помощью программы Master3_Crit.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 04.10.2012 |
Размер файла | 240,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования и науки, молодежи и спорта Украины
Севастопольский национальный технический университет
Лабораторная работа №3
Использование программного интерфейса Win API.
Синхронизация процессов и потоков в ОС Windows
Выполнил: ст. гр. И-31д
Нестеренко А.Е.
Проверил: Дрозин А.Ю.
Севастополь 2012
Цель работы
Изучение программного интерфейса приложений(API) операционных систем Windows 9x, NT, ME, XP. Приобретение практических навыков синхронизации процессов и потоков, используя Win API в средах программирования Borland Delphi, C++ Builder или Visual Studio.
Варианты заданий и порядок выполнения работы
Написать программу Sort3, реализующую следующий алгоритм:
Получить в качестве параметра командной строки номера процесса N_PRC;
Заполнить массив N целых чисел случайными значениями из диапазона 0-100;
Отсортировать массив;
Вывести на экран отсортированный массив в формате N_PRC:A[i](то есть перед выводом каждого элемента массива необходимо выводить значение параметра N_PRC);
Язык программирования, метод и направление сортировки, а также количество элементов массива N выбирается в соответствии с вариантом задания, приведенным в таблице 3.1.
Написать программу Master3, создающую процессы Sort3, используя системные вызовы CreateProcess, передавая в качестве параметра командной строки номер процесса - N_PRC. Необходимо, чтобы все процессы использовали одну консоль и имели класс приоритета NORMAL_PRIORITY_CLASS. Количество процессов выбирается исходя из варианта задания.
Так как процессы имеют одинаковый приоритет, то при выводе элементов массива на экран, используя одну консоль, процессы будут прерывать друг друга. Таким образом, выводимые массивы различных процессов будут «перемешаны». Убедитесь в этом запуская программу Master3.
В данном случае консоль выступает в качестве разделяемого ресурса и очевидна необходимость использования механизмов взаимоисключения, для предотвращения “смешивания” массивов при выводе.
Переписать программы Sort3 и Master3, с использованием механизма взаимоисключений (необходимо использовать объект Mutex). Полученная программа Master3_mtx должна создавать мьютекс (с помощью вызова CreateMutex) перед созданием процессов, а программа Sort3_mtx должна получать идентификатор (handle) мьютекса (с помощью вызова OpenMutex), занимать мьютекс перед выводом отсортированного массива на экран (с помощью вызова WaitForSingleObject), а после вывода массива на экран освобождать мьютекс (используя вызов ReleaseMutex).
Разработать программу Master3_Crit для исследования механизма критических секций.
Программа должна содержать функцию Sort, запускаемую несколько раз в виде отдельных потоков, с помощью вызовов CreateThread. Функция Sort должна: генерировать случайный массив из N элементов, сортировать его и выводить его на экран.
Убедиться в том, что при выполнении программы без использования механизма критических секций при выводе на экран из различных потоков отсортированные массивы будут «перемешиваться».
Добавить вызов InitializeCriticalSection перед созданием потоков и EnterCriticalSection, LeaveCriticalSection, соответственно, перед и после вывода массива на экран в функции Sort. Убедиться в том, что отсортированные массивы выводятся на экран не “перемешиваясь”.
программный интерфейс массив сортировка
Тексты программ
//sort3.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include <Windows.h>
#include <iostream.h>
#include <tchar.h>
#include <cstdlib>
#include <string>
//---------------------------------------------------------------------------
#pragma argsused
void insert (int *x, const int n) //сортировка по убыванию
{
for (int i=1; i<n; i++)
{
int t=x[i];
int j;
for (j=i-1; j>=0 && t>x[j]; j--)
x [j+1]=x[j];
x[j+1]=t;
}
}
void out(int *x, const int n, string s)
{
for (int i = 0; i < n; i++)
{
cout<<s<<':'<<x[i]<<' ';
}
}
int _tmain(int argc, _TCHAR *argv[])
{
string str = argv[1];
int n = 45;
int *A = new int[n];
srand(time(NULL));
for (int i = 0; i < n; i++)
{
A[i] = rand() % 100;
}
insert(A, n);
out(A, n, str);
delete[] A;
return 0;
}
//---------------------------------------------------------------------------
//master3.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include <iostream.h>
#include <Windows.h>
#include <string>
#include <cstdlib>
#include <tchar.h>
//---------------------------------------------------------------------------
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
if (argc > 2)
{
cout<<"Too many parameters..."<<endl;
return 1;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
system("pause");
WaitForSingleObject(pi.hProcess, INFINITE);
return 0;
}
//---------------------------------------------------------------------------
//sort3_mtx.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include <Windows.h>
#include <iostream.h>
#include <tchar.h>
#include <cstdlib>
#include <string>
//---------------------------------------------------------------------------
#pragma argsused
HANDLE hMutex;
void insert (int *x, const int n) //сортировка по убыванию
{
for (int i=1; i<n; i++)
{
int t=x[i];
int j;
for (j=i-1; j>=0 && t>x[j]; j--)
x [j+1]=x[j];
x[j+1]=t;
}
}
void out(int *x, const int n, string str)
{
for (int i = 0; i < n; i++)
{
cout<<str<<':'<<x[i]<<' ';
}
}
int _tmain(int argc, _TCHAR *argv[])
{
if (argc < 2)
{
cout<<"Error in parameters..."<<endl;
return 1;
}
hMutex = OpenMutex(SYNCHRONIZE, FALSE, "Master");
int n = 45;
int *A = new int[n];
srand(time(NULL));
for (int i = 0; i < n; i++)
{
A[i] = rand() % 100;
}
insert(A, n);
WaitForSingleObject(hMutex, INFINITE);
out(A, n, argv[1]);
ReleaseMutex(hMutex);
CloseHandle(hMutex);
delete[] A;
return 0;
}
//---------------------------------------------------------------------------
//master3_mtx.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include <iostream.h>
#include <Windows.h>
#include <string>
#include <cstdlib>
#include <tchar.h>
//---------------------------------------------------------------------------
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
if (argc > 2)
{
cout<<"Too many parameters..."<<endl;
return 1;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));
HANDLE hMutex = CreateMutex(NULL, TRUE, "Master");
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CreateProcess("d:\\sort3.exe", GetCommandLine(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
system("pause");
WaitForSingleObject(hMutex, INFINITE);
return 0;
}
//---------------------------------------------------------------------------
//master_crit.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include <iostream.h>
#include <Windows.h>
#include <string>
#include <cstdlib>
#include <tchar.h>
//---------------------------------------------------------------------------
#pragma argsused
const int n = 45;
int *A = new int[n];
DWORD WINAPI sort(LPVOID lpParam)
{
srand(time(NULL));
for (int i = 0; i < n; i++)
{
A[i] = rand() % 100;
}
for (int i=1; i<n; i++)
{
int t=A[i];
int j;
for (j=i-1; j>=0 && t>A[j]; j--)
A[j+1]=A[j];
A[j+1]=t;
}
for (int i = 0; i < n; i++)
{
cout<<A[i]<<' ';
}
cout<<endl;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD thID;
HANDLE hThread = CreateThread(0, 0, sort, 0, CREATE_SUSPENDED, &thID);
HANDLE hThread1 = CreateThread(0, 0, sort, 0, CREATE_SUSPENDED, &thID);
HANDLE hThread2 = CreateThread(0, 0, sort, 0, CREATE_SUSPENDED, &thID);
SetThreadPriority(hThread, NORMAL_PRIORITY_CLASS);
SetThreadPriority(hThread1, NORMAL_PRIORITY_CLASS);
SetThreadPriority(hThread2, NORMAL_PRIORITY_CLASS);
ResumeThread(hThread);
ResumeThread(hThread1);
ResumeThread(hThread2);
WaitForSingleObject(hThread, INFINITE);
WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
system("pause");
CloseHandle(hThread);
CloseHandle(hThread1);
CloseHandle(hThread2);
return 0;
}
//---------------------------------------------------------------------------
//master_crit(new).cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include <iostream.h>
#include <Windows.h>
#include <string>
#include <cstdlib>
#include <tchar.h>
//---------------------------------------------------------------------------
#pragma argsused
const int n = 45;
int *A = new int[n];
CRITICAL_SECTION CriticalSection;
DWORD WINAPI sort(LPVOID lpParam)
{
srand(time(NULL));
for (int i = 0; i < n; i++)
{
A[i] = rand() % 100;
}
for (int i=1; i<n; i++)
{
int t=A[i];
int j;
for (j=i-1; j>=0 && t>A[j]; j--)
A[j+1]=A[j];
A[j+1]=t;
}
EnterCriticalSection(&CriticalSection);
for (int i = 0; i < n; i++)
{
cout<<A[i]<<' ';
}
cout<<endl;
LeaveCriticalSection(&CriticalSection);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD thID;
InitializeCriticalSection(&CriticalSection);
HANDLE hThread = CreateThread(0, 0, sort, 0, CREATE_SUSPENDED, &thID);
HANDLE hThread1 = CreateThread(0, 0, sort, 0, CREATE_SUSPENDED, &thID);
HANDLE hThread2 = CreateThread(0, 0, sort, 0, CREATE_SUSPENDED, &thID);
SetThreadPriority(hThread, NORMAL_PRIORITY_CLASS);
SetThreadPriority(hThread1, NORMAL_PRIORITY_CLASS);
SetThreadPriority(hThread2, NORMAL_PRIORITY_CLASS);
ResumeThread(hThread);
ResumeThread(hThread1);
ResumeThread(hThread2);
WaitForSingleObject(hThread, INFINITE);
WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
system("pause");
CloseHandle(hThread);
CloseHandle(hThread1);
CloseHandle(hThread2);
return 0;
}
//---------------------------------------------------------------------------
Скриншоты
Рис. 1 -- Программа sort3 выводит отсортированный массив методом вставки в убывающем порядке
Рис. 2 -- Программа Мастер запускает 6 процессов программы Сорт, но тк они все одновременно используют один ресурс (в данном случае консоль), то идет смешение.
Рис. 3 -- Создав мьютекс, мы видим, что теперь доступ к ресурсу разделен и при выводе массива на экран смешения не происходит
Рис. 4 -- Вызов программы master_crit, запускающей 3 процесса Сортировки и вывода массива на печать, видно, что происходит смешение, из-за отсутствия разделения доступа.
Рис. 5 -- Вызов программы master_crit с использованием критических секций. Как видим, теперь 3 потока выводят отсортированный массив на экран по очереди.
Вывод
В ходе выполнения лабораторной работы были приобретены практические навыки синхронизации процессов и потоков средствами WinAPI.
1. Размещено на www.allbest.ru
Подобные документы
Описание общего алгоритма и интерфейса программы. Метод заполнения массива случайными числами. Метод вычисления длины линии между пространственными точками. Создание, синхронизация и завершение потоков. TThread как абстрактный класс, листинг программы.
курсовая работа [664,0 K], добавлен 08.04.2014Разработка проекта с помощью встроенных средств языка C#, на базе сетевого стека и сетевых функций Windows. Специфика создания удобного интерфейса программы с использованием Windows Forms, которая способна пересылать данные на удалённый компьютер.
курсовая работа [162,6 K], добавлен 16.06.2013Классификация, структура и функции операционных систем. Сущность и виды пользовательского интерфейса. Работа Windows в сетевой среде. Использование табличных данных для формирования и заполнения ведомости итогов экзаменационной сессии по факультету.
курсовая работа [2,0 M], добавлен 25.04.2013Создание электрической схемы проектируемого устройства с помощью графического интерфейса. Улучшение кодовой базы с помощью рефакторинга. Разработка алгоритма работы программы. Использование методики Test driven development, написание тестового покрытия.
курсовая работа [1,3 M], добавлен 15.02.2016Требования к аппаратному и программному обеспечению, требуемому для разработки программного модуля. Критерии приемлемости разрабатываемого программного продукта. Разработка удобного пользовательского интерфейса программы. Алгоритм и листинг программы.
курсовая работа [2,6 M], добавлен 23.11.2011Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.
курсовая работа [164,5 K], добавлен 18.05.2014Обзор операционных систем, обеспечивающих взаимную синхронизацию процессов и потоков. Понятие критической секции и критических данных, описание приема взаимного исключения. Использование блокирующих переменных и семафоров. Объекты-взаимоисключения.
доклад [26,7 K], добавлен 27.12.2013Структурная диаграмма программного модуля. Разработка схемы программного модуля и пользовательского интерфейса. Реализация программного модуля: код программы; описание использованных операторов и функций. Вид пользовательской формы с заполненной матрицей.
курсовая работа [215,3 K], добавлен 01.09.2010Изучение устройства и механизма процессов в компиляторах и интерпретаторах. Понятие трансляции как процедуры перевода программного кода с языка Паскаль на язык С++. Описание интерфейса программы и автоматизация процесса построения диаграммы классов.
курсовая работа [536,2 K], добавлен 03.07.2011Разработка блок-схемы и программы обработки одномерного массива с доступом к элементам с помощью индексов и с помощью указателей. Словесное описание алгоритма и пользовательского интерфейса, листинг программы обработки матрицы и результат её выполнения.
курсовая работа [391,1 K], добавлен 30.09.2013