Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода Процессы и потоки.doc
Скачиваний:
7
Добавлен:
14.07.2019
Размер:
401.92 Кб
Скачать

CreateThread

Описание Функция CreateThread создает нить, которая будет выполняться в адресном пространстве вызывающего процесса. Объект созданной нити может быть использован в качестве объекта синхронизации. Он создается в не­сигнальном состоянии и переходит в сигнальное состояние по завершении нити. Выполнение нити начинается с функции, определяемой параметром lpStartAddr. Если эта функция возвращает значение, тогда это значение типа DWORD, которое используется для завершения нити неявным вызо­вом ExitThread. Для получения значения, возвращаемого нитью, применя­ется функция GetExitCodeThread. Нить создается с приоритетом

THREAD_PRIORITY_NORMAL. Для получения и установки значения приоритета нити применяются функции GetThreadPriority и SetThreadPriority. Объект нити остается в системе до тех пор, пока не завершится нить и не закроются все дескрипторы в результате вызова функции CloseHandle.

Синтаксис HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadSecurity, DWORD cbStack, LPTHREAD_START_ROUTINE lpStartAddr, LPVOID lpvThreadParam, DWORD dwCreateFlags, LPDWORD lpdwThreadId)

Возвращаемое значение HANDLE: Если выполнение рассматриваемой функции оказывается успешным, возвращается дескриптор нового объекта нити. В противном случае возвращается NULL. Для выборки расширенной информации об ошибке используется функция GetLastError.

Включаемый файл winbase.h

См. также CloseHandle, CreateProcess,CreateRemoteThread, ExitThread, GetExitCodeThread, GetLastError, OpenThreadToken, SetErrorMode, TerminateProcess, TerminateThread.

Пример См. пример применения функции CreateSemaphore.

EnterCriticalSection

Описание Функция EnterCriticalSection ожидает получения прав владения указанным объектом критического участка кода. Возврат из функции осуществляет­ся после того, как права владения будут предоставлены вызывающей нити. Объекты критического участка кода вводят в действие взаимно исключа­ющую синхронизацию нитей одного процесса. После того как нить овла­деет объектом критического участка кода, она может вызвать функцию EnterCriticalSection для этого же объекта критического участка кода, что однако не приводит к ее самоблокировке. Функция LeaveCriticalSection должна вызываться столько раз, сколько нить входит в критический участок кода, прежде чем другие нити смогут получить права владения данным объектом. Чтобы разрешить взаимно исключающий доступ к разделяемому ресурсу, каждая нить обращается к EnterCriticalSection либо к TryEnterCriticalSection для запроса прав владения критическим участком кода перед выполнением любого участка кода, в котором требуется дос­туп к защищенному ресурсу.

Синтаксис VOID EnterCriticalSection (LPCRITICAL_SECTION lpcs)

Параметры lpcs LPCRITICAL_SECTION: Указатель на объект критического участка кода.

Включаемый файл winbase.h

См. также CreateMutex, DeleteCriticalSection, InitializeCriticalSection, LeaveCriticalSection.

Пример В приведенном ниже примере выполнение критического участка кода (ожидание в течение пяти секунд) внутри процедуры порожденной нити разрешается только одной нити. Всякий раз, когда пользователь выбирает пункт меню Test!, создается новая нить. Объект критического участка кода в процедуре этой нити упорядочивает выполнение данного участка кода.

См. \local-sources\chap25\25-07.txt

EntCrSec.h

#define IDM_EXIT 100

#define IDM_TEST 200

#define IDM_ABOUT 301

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM);

EntCrSec.rc

#include "windows.h"

#include "EntCrSec.h"

MYAPP ICON DISCARDABLE "GENERIC.ICO"

MYAPP MENU DISCARDABLE

BEGIN

POPUP "&File"

BEGIN

MENUITEM "E&xit", IDM_EXIT

END

MENUITEM "&Test!", IDM_TEST

POPUP "&Help"

BEGIN

MENUITEM "&About My Application...", IDM_ABOUT

END

END

ABOUTBOX DIALOG 22, 17, 171, 43

STYLE DS_MODALFRAME | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU

CAPTION "My Application"

FONT 8, "MS Sans Serif"

{

CONTROL "MyApp", -1, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 3, 2, 16, 16

CONTROL "Generic Application", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 28, 4, 100, 8

CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 116, 26, 50, 14

}