Презентация Синхронизация потоков в Windows онлайн
На нашем сайте вы можете скачать и просмотреть онлайн доклад-презентацию на тему Синхронизация потоков в Windows абсолютно бесплатно. Урок-презентация на эту тему содержит всего 35 слайдов. Все материалы созданы в программе PowerPoint и имеют формат ppt или же pptx. Материалы и темы для презентаций взяты из открытых источников и загружены их авторами, за качество и достоверность информации в них администрация сайта не отвечает, все права принадлежат их создателям. Если вы нашли то, что искали, отблагодарите авторов - поделитесь ссылкой в социальных сетях, а наш сайт добавьте в закладки.
Презентации » Устройства и комплектующие » Синхронизация потоков в Windows
Оцените!
Оцените презентацию от 1 до 5 баллов!
- Тип файла:ppt / pptx (powerpoint)
- Всего слайдов:35 слайдов
- Для класса:1,2,3,4,5,6,7,8,9,10,11
- Размер файла:132.06 kB
- Просмотров:68
- Скачиваний:0
- Автор:неизвестен
Слайды и текст к этой презентации:
№2 слайд
![Критические секции](/documents_6/dc17c402315758529aba5e225893eaf0/img1.jpg)
Содержание слайда: Критические секции
Критические секции
Для работы с объектами типа critical_section используются следующие функции:
// инициализация критической секции
VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// вход в критическую секцию
VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// попытка войти в критическую секцию
BOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// выход из критической секции
VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// разрушение объекта критическая секция
VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
№4 слайд
![int main int main int i, j](/documents_6/dc17c402315758529aba5e225893eaf0/img3.jpg)
Содержание слайда: int main() {
int main() {
int i, j ;
HANDLE hThread; DWORD IDThread;
hThread=CreateThread(NULL, 0, thread, NULL, 0, &IDThread) ;
if (hThread == NULL) return GetLastError();
for (j = 10; j < 20; ++j) {
for (i = 0; i < 10; ++i) {
// выводим строку чисел j
cout « j « ‘ ‘ « flush;
Sleep(17);
}
cout « endl;
}
// ждем, пока поток thread закончит свою работу
WaitForSingleObject(hThread, INFINITE);
return 0;
}
№5 слайд
![include lt windows.h gt](/documents_6/dc17c402315758529aba5e225893eaf0/img4.jpg)
Содержание слайда: #include <windows.h> #include <iostream>
#include <windows.h> #include <iostream>
using namespace std;
CRITICAL_SECTION cs;
DWORD WINAPI thread(LPVOID)
{
int i,j;
for (j = 0; j < 10; ++j)
{
// входим в критическую секцию
EnterCriticalSection (&cs);
for (i = 0; i < 10; ++i)
{
cout « j « ' '« flush;
Sleep(7);
}
cout « endl;
// выходим из критической секции
LeaveCriticalSection(&cs);
}
return 0;
}
№6 слайд
![int main int main int i,j](/documents_6/dc17c402315758529aba5e225893eaf0/img5.jpg)
Содержание слайда: int main() {
int main() {
int i,j;
HANDLE hThread; DWORD IDThread;
// инициализируем критическую секцию
InitializeCriticalSection(&cs);
hThread=CreateThread(NULL, 0, thread, NULL, 0, &IDThread);
if (hThread == NULL) return GetLastError();
for (j = 10; j < 20; ++j) {
// входим в критическую секцию
EnterCriticalSection(&cs);
for (i = 0; i < 10; ++i) {
cout « j « ' ' « flush; Sleep(7) ;
}
cout « endl;
// выходим из критической секции
LeaveCriticalSection(&cs);
}
// ждем, пока поток thread закончит свою работу
WaitForSingleObject(hThread, INFINITE);
// закрываем критическую секцию
DeleteCriticalSection(&cs);
return 0;
}
№7 слайд
![Объекты синхронизации и](/documents_6/dc17c402315758529aba5e225893eaf0/img6.jpg)
Содержание слайда: Объекты синхронизации и функции ожидания
Объекты синхронизации и функции ожидания
В операционных системах Windows объектами синхронизации называются объекты ядра, которые могут находиться в одном из двух состояний: сигнальном (signaled) и несигнальном (nonsignaled). Объекты синхронизации могут быть разбиты на четыре класса.
№8 слайд
![К первому классу относятся](/documents_6/dc17c402315758529aba5e225893eaf0/img7.jpg)
Содержание слайда: К первому классу относятся объекты синхронизации, т. е. те, которые служат только для решения задач синхронизации параллельных потоков:
К первому классу относятся объекты синхронизации, т. е. те, которые служат только для решения задач синхронизации параллельных потоков:
мьютекс (mutex);
событие (event);
семафор (semaphore).
Ко второму классу объектов синхронизации относится ожидающий таймер (waitable timer), который переходит в сигнальное состояние по истечении заданного интервала времени.
К третьему классу синхронизации относятся объекты, которые переходят в сигнальное состояние по завершении своей работы:
работа (job);
процесс (process);
поток (thread).
К четвертому классу относятся объекты синхронизации, которые переходят в сигнальное состояние после получения сообщения об изменении содержимого объекта. К ним относятся:
изменение состояния каталога (change notification);
консольный ввод (console input).
№9 слайд
![Функции ожидания в Windows](/documents_6/dc17c402315758529aba5e225893eaf0/img8.jpg)
Содержание слайда: Функции ожидания в Windows это такие функции, параметрами которых являются объекты синхронизации. Эти функции обычно используются для блокировки потоков.
Функции ожидания в Windows это такие функции, параметрами которых являются объекты синхронизации. Эти функции обычно используются для блокировки потоков.
Для ожидания перехода в сигнальное состояние одного объекта синхронизации используется функция WaitForSingieObject, которая имеет следующий прототип:
DWORD WaitForSingleObject(
HANDLE hHandle, // дескриптор объекта
DWORD dwMilliseconds // интервал ожидания в миллисекундах
) ;
№10 слайд
![Для ожидания перехода в](/documents_6/dc17c402315758529aba5e225893eaf0/img9.jpg)
Содержание слайда: Для ожидания перехода в сигнальное состояние нескольких объектов синхронизации или одного из нескольких объектов синхронизации используется функция WaitForMuitipieObject, которая имеет следующий прототип:
Для ожидания перехода в сигнальное состояние нескольких объектов синхронизации или одного из нескольких объектов синхронизации используется функция WaitForMuitipieObject, которая имеет следующий прототип:
DWORD WaitForMultipleObjects(
DWORD nCount, // количество объектов
CONST HANDLE *lpHandles, // массив дескрипторов объектов
BOOL bWaitAll, // режим ожидания
DWORD dwMilliseconds // интервал ожидания в миллисекундах
) ;
№11 слайд
![Мьютексы Мьютексы Для решения](/documents_6/dc17c402315758529aba5e225893eaf0/img10.jpg)
Содержание слайда: Мьютексы
Мьютексы
Для решения проблемы взаимного исключения между параллельными потоками, выполняющимися в контекстах разных процессов, в операционных системах Windows используется объект ядра мьютекс. Слово мьютекс происходит от английского слова mutex, которое в свою очередь является сокращением от выражения mutual exclusion, что на русском языке значит "взаимное исключение". Мьютекс находится в сигнальном состоянии, если он не принадлежит ни одному потоку. В противном случае мьютекс находится в несигнальном состоянии. Одновременно мьютекс может принадлежать только одному потоку.
№13 слайд
![include lt windows.h gt](/documents_6/dc17c402315758529aba5e225893eaf0/img12.jpg)
Содержание слайда: #include <windows.h>
#include <windows.h>
#include <iostream>
HANDLE hMutex;
char IpszAppName [] = "С:\\ConsoleProcess.exe";
STARTUPINFO si;
PROCESS_INFORMATION pi;
// создаем мьютекс
hMutex = CreateMutex(NULL, FALSE, "DemoMutex");
if (hMutex == NULL)
{
cout « "Create mutex failed." « endl;
cout « "Press any key to exit." « endl;
cin.get();
return GetLastError();
}
№14 слайд
![ZeroMemory amp si, sizeof](/documents_6/dc17c402315758529aba5e225893eaf0/img13.jpg)
Содержание слайда: ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
// создаем новый консольный процесс
if (!CreateProcess(IpszAppName, NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi))
{
cout « "The new process is not created." « endl;
cout « "Press any key to exit." « endl;
cin.get();
return GetLastError();
}
// выводим на экран строки
for (int j = 0; j < 10; ++j) {
// захватываем мьютекс
WaitForSingleObject(hMutex, INFINITE);
for (int i = 0; i < 10; i++) {
cout « j « ' ' « flush; Sleep(10);
№15 слайд
![cout endl освобождаем мьютекс](/documents_6/dc17c402315758529aba5e225893eaf0/img14.jpg)
Содержание слайда: }
}
cout « endl; // освобождаем мьютекс
ReleaseMutex (hMutex) ;
}
// закрываем дескриптор мьютекса
CloseHandle(hMutex);
// ждем пока дочерний процесс закончит работу
WaitForSingleObject (pi .hProcess, INFINITE) ;
// закрываем дескрипторы дочернего процесса в
текущем процессе
CloseHandle (pi .hThread) ;
CloseHandle(pi.hProcess);
return 0;
}
№16 слайд
![include lt windows.h gt](/documents_6/dc17c402315758529aba5e225893eaf0/img15.jpg)
Содержание слайда: #include <windows.h>
#include <windows.h>
#include <iostream>
int main() {
HANDLE hMutex;
int i , j ;
// открываем мьютекс
hMutex = OpenMutex(SYNCHRONIZE, FALSE,"DemoMutex");
if (hMutex == NULL) {
cout « "Open mutex failed." « endl;
cout « "Press any key to exit." « endl;
cin.get();
return GetLastError();
for (j = 10; j < 20; j++) {
№17 слайд
![захватываем мьютекс](/documents_6/dc17c402315758529aba5e225893eaf0/img16.jpg)
Содержание слайда: // захватываем мьютекс
// захватываем мьютекс
WaitForSingleObject(hMutex, INFINITE);
for (i = 0; i < 10; i++) {
cout « j « ' ' « flush;
Sleep(5);
}
cout « endl; // освобождаем мьютекс
ReleaseMutex(hMutex);
}
// закрываем дескриптор объекта
CloseHandle(hMutex);
return 0;
}
№18 слайд
![События События Событием](/documents_6/dc17c402315758529aba5e225893eaf0/img17.jpg)
Содержание слайда: События
События
Событием называется оповещение о некотором выполненном действии. В программировании события используются для оповещения одного потока о том, что другой поток выполнил некоторое действие. Сама же задача оповещения одного потока о некотором действии, которое совершил другой поток, называется задачей условной синхронизации. В операционных системах Windows события описываются объектами ядра Events.
При этом различают два типа событий:
события с ручным сбросом;
события с автоматическим сбросом.
№19 слайд
![Создаются события вызовом](/documents_6/dc17c402315758529aba5e225893eaf0/img18.jpg)
Содержание слайда: Создаются события вызовом функции CreateEvent, которая имеет следующий прототип:
Создаются события вызовом функции CreateEvent, которая имеет следующий прототип:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES IpSecurityAttributes,
// атрибуты защиты
BOOL bManualReset,
// тип события
BOOL blnitialState,
// начальное состояние события
LPCTSTR lpName
// имя события
) ;
№20 слайд
![Для перевода любого события в](/documents_6/dc17c402315758529aba5e225893eaf0/img19.jpg)
Содержание слайда: Для перевода любого события в сигнальное состояние используется функция SetEvent, которая имеет следующий прототип:
Для перевода любого события в сигнальное состояние используется функция SetEvent, которая имеет следующий прототип:
BOOL SetEvent(
HANDLE hEvent // дескриптор события
) ;
№21 слайд
![include lt windows.h gt](/documents_6/dc17c402315758529aba5e225893eaf0/img20.jpg)
Содержание слайда: #include <windows.h>
#include <windows.h>
#include <iostream>
HANDLE hOutEvent, hAddEvent;
DWORD WINAPI thread (LPVOID) {
for (int i = 0; i < 10; ++i)
if (i == 4) {
SetEvent(hOutEvent);
WaitForSingleObject(hAddEvent, INFINITE);
}
return 0;
}
int main() {
HANDLE hThread; DWORD IDThread;
№22 слайд
![создаем события с](/documents_6/dc17c402315758529aba5e225893eaf0/img21.jpg)
Содержание слайда: // создаем события с автоматическим сбросом
// создаем события с автоматическим сбросом
hOutEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (hOutEvent == NULL)
return GetLastError();
hAddEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (hAddEvent == NULL) return GetLastError();
// создаем поток thread
hThread = CreateThread(NULL, 0, thread, NULL, 0, &IDThread);
if (hThread == NULL)
return GetLastError();
// ждем, пока поток thread выполнит половину работы
WaitForSingleObject(hOutEvent, INFINITE);
№23 слайд
![выводим значение переменной](/documents_6/dc17c402315758529aba5e225893eaf0/img22.jpg)
Содержание слайда: // выводим значение переменной
// выводим значение переменной
cout « "A half of the work is done." « endl;
cout « "Press any key to continue." « endl;
cin.get();
// разрешаем дальше работать потоку thread
SetEvent (hAddEvent) ;
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
CloseHandle(hOutEvent);
CloseHandle(hAddEvent);
cout « "The work is done." « endl;
return 0;
}
№24 слайд
![Доступ к существующему](/documents_6/dc17c402315758529aba5e225893eaf0/img23.jpg)
Содержание слайда: Доступ к существующему событию можно открыть с помощью функции
Доступ к существующему событию можно открыть с помощью функции
CreateEvent или OpenEvent.
HANDLE OpenEvent(
DWORD dwDesiredAccess, // флаги доступа
BOOL blnheritHandle, // режим наследования
LPCTSTR lpName // имя события
) ;
№25 слайд
![Параметр dwDesiredAccess](/documents_6/dc17c402315758529aba5e225893eaf0/img24.jpg)
Содержание слайда: Параметр dwDesiredAccess определяет доступ к событию и может быть равен любой логической комбинации следующих флагов:
Параметр dwDesiredAccess определяет доступ к событию и может быть равен любой логической комбинации следующих флагов:
ЕVENT_ALL_АСCESS — полный доступ;
еvent_modify_sтате — модификация состояния;
synchronize — синхронизация.
Эти флаги устанавливают следующие режимы доступа к событию:
флаг еvent_all_асcess означает, что поток может выполнять над событием любые действия;
флаг event_modify_state означает, что поток может использовать функции SetEvent и ResetEvent для изменения состояния события;
флаг synchronize означает, что поток может использовать событие в функциях ожидания.
№26 слайд
![include lt windows.h gt](/documents_6/dc17c402315758529aba5e225893eaf0/img25.jpg)
Содержание слайда: #include <windows.h>
#include <windows.h>
#include <iostream>
HANDLE hlnEvent;
char IpEventName[ ] = "InEventName";
int main() {
DWORD dwWaitResult;
char szAppName[] = "D:\\ConsoleProcess.exe";
STARTUPINFO si;
PROCESS_INFORMATION pi;
// создем событие, отмечающее ввод символа
hlnEvent = CreateEvent(NULL, FALSE, FALSE,
IpEventName);
if (hlnEvent == NULL)
return GetLastError();
№27 слайд
![запускаем процесс, который](/documents_6/dc17c402315758529aba5e225893eaf0/img26.jpg)
Содержание слайда: // запускаем процесс, который ждет ввод символа
// запускаем процесс, который ждет ввод символа
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
if (!CreateProcess(szAppName, NULL, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
return 0;
// закрываем дескрипторы этого процесса
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
// ждем оповещение о наступлении события о вводе символа
dwWaitResult = WaitForSingieObject(hlnEvent, INFINITE);
if (dwWaitResult != WAIT_OBJECT_0) return dwWaitResult;
cout « "A symbol has got. " « endl;
CloseHandie (hlnEvent) ;
cout « "Press any key to exit.";
cin.get();
return 0;
}
№28 слайд
![include lt windows.h gt](/documents_6/dc17c402315758529aba5e225893eaf0/img27.jpg)
Содержание слайда: #include <windows.h>
#include <windows.h>
#include <iostream>
HANDLE hlnEvent;
CHAR lpEventName[]="InEventName" ;
int main () {
char c;
hlnEvent = OpenEvent (EVENT_MODIFY_STATE,
FALSE, lpEventName);
if (hlnEvent == NULL) {
cout « "Open event failed." « endl;
cout « "Input any char to exit." « endl;
cin.get();
return GetLastError();
}
№29 слайд
![cout quot Input any char quot](/documents_6/dc17c402315758529aba5e225893eaf0/img28.jpg)
Содержание слайда: cout « "Input any char: ";
cout « "Input any char: ";
cin » c;
// устанавливаем событие о вводе символа
SetEvent(hlnEvent);
// закрываем дескриптор события в текущем процессе
CloseHandie(hlnEvent);
cin.get();
cout << "Press any key to exit." << endl;
cin.get();
return 0;
}
№30 слайд
![Семафоры Семафоры Семафоры в](/documents_6/dc17c402315758529aba5e225893eaf0/img29.jpg)
Содержание слайда: Семафоры
Семафоры
Семафоры в операционных системах Windows описываются объектами ядра semaphores. Семафор находится в сигнальном состоянии, если его значение больше нуля. В противном случае семафор находится в несигнальном состоянии.
Создаются семафоры посредством вызова функции CreateSemaphore, которая имеет следующий прототип:
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES IpSemaphoreAttribute,
// атрибуты защиты
LONG llnitialCount,
// начальное значение семафора
LONG IMaximumCount,
// максимальное значение семафора
LPCTSTR lpName
// имя семафора
);
№32 слайд
![HANDLE OpenSemaphore HANDLE](/documents_6/dc17c402315758529aba5e225893eaf0/img31.jpg)
Содержание слайда: HANDLE OpenSemaphore(
HANDLE OpenSemaphore(
DWORD dwDesiredAccess, // флаги доступа
BOOL blnheritHandle, // режим наследования
LPCTSTR lpName // имя события
);
Параметр dwDesiredAccess определяет доступ к семафору и может быть равен любой логической комбинации следующих флагов:
semaphore_all_access — полный доступ к семафору;
semaphore_modify_state — изменение состояния семафора;
synchronize — синхронизация.
№33 слайд
![include lt windows.h gt](/documents_6/dc17c402315758529aba5e225893eaf0/img32.jpg)
Содержание слайда: #include <windows.h>
#include <windows.h>
#include <iostream>
volatile int a[10];
HANDLE hSemaphore;
DWORD WINAPI thread(LPVOID)
{
for (int i = 0; i < 10; i++)
{
a [i] = i + 1;
// отмечаем, что один элемент готов
ReleaseSemaphore(hSemaphore,1,NULL);
Sleep(500) ;
}
return 0;
}
№34 слайд
![int main int main int i](/documents_6/dc17c402315758529aba5e225893eaf0/img33.jpg)
Содержание слайда: int main()
int main()
{
int i;
HANDLE hThread;
DWORD IDThread;
cout « "An initial state of the array: ";
for (i = 0; i < 10; i++)
cout « a[i] «' ';
cout « endl;
// создаем семафор
hSemaphore=CreateSemaphore(NULL/ 0, 10, NULL);
if (hSemaphore == NULL) return GetLastError();
// создаем поток, который готовит элементы массива
hThread = CreateThread(NULL, 0, thread, NULL, 0,
&IDThread);
if (hThread == NULL) return GetLastError();
№35 слайд
![поток main выводит элементы](/documents_6/dc17c402315758529aba5e225893eaf0/img34.jpg)
Содержание слайда: // поток main выводит элементы массива только после их подготовки потоком thread
// поток main выводит элементы массива только после их подготовки потоком thread
cout « "A final state of the array: ";
for (i = 0; i < 10; i++)
{
WaitForSingleObject(hSemaphore, INFINITE);
cout « a[i] « " \a" « flush;
}
cout « endl;
CloseHandle(hSemaphore);
CloseHandle(hThread);
return 0;
}
Скачать все slide презентации Синхронизация потоков в Windows одним архивом:
Похожие презентации
-
Межпроцессное взаимодействие. Синхронизация потоков с использованием объектов ядра Windows 2000
-
Синхронизация процессов и потоков. Межпроцессное взаимодействие
-
Параллельное программирование. Проблемы многопоточных приложений. Примитивы синхронизации потоков
-
Операционные системы. Межпроцессное взаимодействие. Реализация блокировок и синхронизация потоков в OpenMP
-
Windows Forms. Создание графического приложения
-
Net Framework - платформа разработки, для создания приложений для Windows, Windows Phone, Windows Server и Microsoft Azure
-
Операционная система Windows. Программирование с использованием средств Win32 API. (Лекция 2)
-
Понятие потоков ввода/вывода
-
Потоковые Алгоритмы. Лекция 7
-
Синхронизация обмена данными