BOOL SetThreadPriority(HANDLE hThread, int nPriority), 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

BOOL SetThreadPriority(HANDLE hThread, int nPriority),



где hThread – описатель потока, приоритет которого изменяется,

nPriority - приоритет, который принимает одно из следующих значений:

THREAD_PRIORITY_TIME_C RITICAL // Критичный по времени

THREAD_PRIORITY_HIGHEST // Наивысший

THREAD_PRIORITY_ABOVE_NORMAL // Выше нормального

THREAD_PRIORITY_NORMAL // Нормальный

THREAD_PRIORITY_BELOW_NORMAL // Ниже нормального

THREAD_PRIORITY_LOWEST // Самый низкий

THREAD_PRIORITY_IDLE // Простаивающий

В момент создания потока начальное значение его относительного приоритета равно THREAD_PRIORITY_NORMAL.

Синхронизация потоков. В приложениях WINDOWS различают два типа потоков: потоки пользовательского интерфейса и рабочие потоки.

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

Рабочие потоки не обрабатывают сообщения WINDOWS и используются для выполнения фоновых задач.

В среде, позволяющей исполнять несколько потоков одновременно, очень важно синхронизировать их деятельность. Для этого в операционных системах, базирующихся на Win32, предусмотрен целый ряд синхронизирующих объектов: критические секции, объекты мьютексы, семафоры, события, ожидаемые таймеры и др.

В общем случае поток синхронизирует себя с другими так: он засыпает, и операционная система, не выделяя ему процессорного времени, приостанавливает его выполнение. Но прежде чем заснуть, поток сообщает системе, какое событие должно произойти, чтобы его исполнение возобновилось. Как только указанное событие произойдет, поток вновь получает право на выделение ему процессорного времени и все пойдет своим чередом. Таким образом, выполнение потока синхронизировано с определенным событием.

Каждый объект может находиться в одном из двух состояний: свободном (signaled) или занятом (nonsignaled). Потоки могут останавливаться и ждать освобождения какого-либо объекта. Когда поток создан и начинает использование своего кода, сопоставленный с ним объект ядра "поток" получает статус занятого. При завершении потока соответствующий объект ядра освобождается.

Объекты мьютексы. Объекты мьютексы способны синхронизировать потоки, выполняемые в разных процессах. С этой целью поток в каждом процессе должен располагать своим, специальным для данного процесса описателем единственного объекта мьютекса.

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

Функция создания объекта мьютекса.

HANDLE CreateMutex (LPSECURITY_ATTRIBUTES lpsa,BOOL fInitiaOwner, LPTSTR lpsz MutexName).

Потоки усыпляют себя до освобождения какого-либо объекта ядра с помощью двух основных функций:

DWORD WaitForSingleObject (HANDLE hObject,DWORD dwTimeout) и

DWORD WaitForMultipleObjects (DWORD cObjects,LPHANDLE lpHandles, BOOL bWaitAll,DWORD dwTimeout).

Функция перевода объекта мьютекст в свободное состояние: ReleaseMutex (HANDLE hObject).

Отказ от объекта мьютекса происходит, когда ожидавший его поток захватывает этот объект (переводя в занятое состояние), а затем завершается.

Критические секции. Объект критические разделы можно представить как ключ, открывающий доступ к разделяемому ресурсу. Когда один из потоков владеет объектом критического раздела, другие потоки, требующие доступа к заблокированному ресурсу, должны приостанавливать свою работу до тех пор, пока первый поток не освободит ключ. Критические секции применяются для синхронизации потоков в пределах одного процесса. Они позволяют сделать так, чтобы единовременно только один поток получал доступ к определенному региону.

Функция инициализации критической секции - InitializeCriticalSection (LPCRITICAL_SECTION lpCriticalSection).

Функция открытия критической секции – EnterCriticalSection (&g_CriticalSection).

Функция удаления критической секции – DeleteCriticalSection (&g_CriticalSection).

Функция освобождения критической секции – LeaveCriticalSection (&g_CriticalSection), где g_CriticalSection –переменная структуры CRITICAL_SECTION

Семафоры. Объекты ядра семафор (Semaphore) используются для учета ресурсов. Они позволяют потоку запрашивать число доступных ресурсов. Если один или более ресурсов свободны, счетчик доступных ресурсов после запроса уменьшается на 1.Система разрешает другому потоку запрашивать какой-либо ресурс только после уменьшения счетчиков доступных ресурсов.

Поскольку на счетчик ресурсов семафора могут влиять несколько потоков, семафоры не передаются во владение какому-либо потоку. Один поток может ждать семафор (уменьшив его счетчик ресурсов), а другой освободить семафор (увеличив счетчик ресурсов).

Функция создания семафора.

HANDLE CreateSemaphore (LPSECURITY_ATTRIBUTE lpsa,

LONG cSemInitial,LONG cSemMax,LPTSTR lpszSemName).

Эта функция создаёт семафор, максимальное значение счетчика которого cSemMax. Параметр сSemInitial позволяет задать начальное состояние счетчика. Последний параметр функции lpszSemName - указатель на имя семафора. В дальнейшем это имя позволит получить описатель семафора из других процессов с помощью CreateSemaphore или OpenSemaphore.

Функция открытия семафора.

HANDLE OpenSemaphore (DWORD fdwAccess,BOOL fInherit,

LPTSTR lpszName).

Параметр fdwAccess может быть равен либо SYNCHRONIZE, либо SEMAPHORE_ALL_ACCESS. Параметр fInherit определяет, унаследует ли дочерний процесс данный описатель данного объекта. Параметр lpszName -это указатель на объект в виде строки с нулевым символом в конце.

Функция перевода семафора в свободное состояние.

BOOL ReleaseSemaphore (HANDLE hSemaphore, LONG cRelease,

LPLONG lplPrevious).

Любой поток может вызвать эту функцию когда угодно, поскольку объекты семафор не принадлежат лишь какому-то одному потоку. С её помощью счетчик ресурсов можно увеличивать более чем на 1 одновременно. Параметр cRelease определяет, как должен освобождаться семафор.

Последний параметр функции ReleaseSemaphore - lplPrevious - указатель на переменную типа LONG, в которой возвращается значение счетчика ресурсов, предшествующее тому, что получилось после его увеличения на cRelease. Если Вас не интересует это значение, передайте в параметре значение NULL.

События. События – объекты синхронизации, которые уведомляют об окончании какой-либо операции. Объекты события бывают двух типов: со сбросом вручную и автосбросом. Первые уведомляют об окончании операции сразу несколько потоков, вторые - только один поток. События обычно используют в тех случаях, когда какой-то поток выполняет инициализацию, а затем сигнализирует другому потоку, что тот может продолжить работу. Инициализирующий поток переводит объект событие в занятое состояние и приступает к своим операциям. По окончании инициализации поток сбрасывает событие в свободное состояние. Как только инициализирующий поток освободит событие, рабочий поток проснется и продолжит работу.

Функциясоздания события.

HANDLE CreateEvent (LPSECURITY_ATTRIBUTES lpsa,

BOOL fManualReset, BOOL fInitialState,

LPTSTR lpszEventName),

где параметр fManualReset сообщает системе, какое событие создается: со сбросом(TRUE) или с автосбросом(FALSE); параметр fInitialState определяет начальное состояние события: свободное(TRUE) или занятое (FALSE). Функция возвращает описатель события, специфичный для конкретного процесса.

Функция открытия события.

HANDLE OpenEvent (DWORD fdwAccess, BOOL fInherit, LPTSTR lpszName).

Функция закрытия события.

CloseHandle (HANDLE hObgect), где hObgect – дискриптор объекта для закрытия.

 

6.2.Требования к программе:

Написать программу, в которой необходимо реализовать:

1. Два потока, рабочие функции которых вычисляют сумму n чисел, а число n задается произвольно.

2. Отображение состояния выполняемых потоков с помощью линейных индикаторов.

3. Синхронизацию выполнения потоков с помощью объектов синхронизации.

4. Запуск потоков с помощью стандартных управляющих элементов.

 

Отчет должен содержать: постановку задачи, листинг кода всех модифицированных функций и их назначение, выводы.

 

Варианты заданий

6.4.Контрольные вопросы

1. Процесс, поток.

2. Многозадачность.

3. В каких состояниях может находиться поток?

4. Перечислите основные функции для работы с потоками.

5. Осветите механизм завершения работы потоков.

6. Расскажите о распределении процессорного времени между потоками.

7. Объясните необходимость механизма синхронизации потоков.

8. Перечислите основные объекты синхронизации.

9. Перечислите основные функции для создания потоков и объектов синхронизации потоков.

 

 

Лабораторная работа № 7



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 348; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.182.179 (0.015 с.)