Синхронизация процессов

ЛЕКЦИЯ №11

ВОЛОКНА

ЛЕКЦИЯ №10

ПОТОКИ

HANDLE CreateThread(

LPSECURITY ATTRIBUTES ProcAttr,

SIZT_T StackSize,

LPTHREAD_START_ROUTINE Func,

LPVOID Params,

DWORD Flags,

LPWORD ThreadId)

1) Показывает NULL

2) Размер стэка зависит от того, что делает поток

3) Функция, которая будет запущена в качестве потока

4) Параметр, который попадает в функцию как данные

5) Создать, но не запускать

6) Iв потока

VOID ExitThread(DWORD ExitCode)

Завершение потока.

BOOL TerminateThread(HANDLE h,

DWORD ExitCode)

DWORD [Suspend/Resume] Thread(HANDLE h)

Suspend – приостановить работу потока

Resume – возобновить работу потока

Действие функции Suspend является накапливаемым (если два раза запустить функцию SuspendThread одному и тому же потоку, то необходимо вызвать дважды ResumeThread)

BOOL SwitchToThread()

Вызвать планировщик системы.

DWORD SetThreadAffinitiMask(HANDLE h,

DWORD NetMask)

Уст. множество процессоров, на которых поток может работать.

Результат – предыдущая маска, в которой все работало

DWORD SetThreadIdealProcessor(HANDLE h,

DWORD NProc)

Устанавливаем для потока предпочитаемый процессор. Если все равно какой процессор, то вместо NProc ставим константу MAXIMUM_PROCESSOR.

(потоки, которыми мы сами управляем)

LPVOID CreateFiber(

SIZE_T StackSize,

LPFIBER_START_ROUTINE Func,

LPVOID Params) – создаем волокно.

VOID DeleteFiber(LPVOID f) – удаление волокны

LPVOID ConvertThreadToFiber (LPVOID Params) – прежде чем начать работу один поток превратить в волокно.

BOOL ConvertFiberToThread() – уничтожаем структуру волокна и превращаем его в поток

VOID SwitchToFiber(LPVOID f) – переключиться на указанное волокно

DWORD WiteForSingleObject(HANDLE h,

DWORD Timeout)

Ждет указанное время некоторый объект.

Если мы хотим ждать «до потери пульса», то вместо указания времени пишем INFINITE. Ждать для процессов и потоков – это значит дождаться их окончания.

Результат: WAIT_TIMEOUT – не дождались (истекло время)

WAIT_OBJECT – дождались

WAIT_ABANDONED – только для MUTEX, означает, что поток завершился, но MUTEX не освободился.

DWORD WaitForMultipleObject(DWORD nCount,

HANDLE *h,

BOOL WaitAll,

DWORD TimeOut)

первый параметр – это количество элементов массива, далее идет указатель на первый элемент массива, следующий параметр – ждем одного из или всех вместе. И последний параметр – время ожидания.

Результат: WAIT_TIMEOUT – не дождались (если третий параметр false – значит никого не дождались, если true – не дождались сразу всех)

WAIT_OBJECT – дождались.

MUTEX выполняет в системе роль критической секции.

Захватить MUTEX – войти в критическую секцию.

Освободить MUTEX – выйти из критической секции.

MUTEX может принадлежать одному потоку, который будет считать, что он находится в критической секции.

HANDLE CreateMutex(LPSECURITY ATTRIBUTES ProcAttr,

BOOL InitOwuer,

LPCTSTR Sysname)

Создает объект

1) параметры безопасности,

2) Будем ли мы при создании mutex захватывать его или нет.

3) Системное имя mutex

BOOL ReleaseMutex(HANDLE h) – освободить mutex

Если нам объект больше не нужен, то вызываем функцию

BOOL CloseHandle(HANDLE h)