
- •21. Виды программных единиц в современных ос
- •22. Программное порождение процессов в Unix
- •23. Программное порождение процессов в Windows
- •24. Программное уничтожение процессов
- •25. Ожидание завершения процессов
- •26. Иерархия процессов и ее использование
- •27. Понятие нити и связь ее с процессом
- •28. Создание нитей (thread) в программахWindows.
- •29. Создание posiXнитей в программе.
- •Int pthread_create(pthread_t* tid, const pthread_attr_t* att, void*(*fun)(void*), void* argp)
- •Int pthread_exit(void *status)
- •30. Уничтожение (отмена) нитей
- •Int pthread_setcancelstate(int state, int *oldstate),
- •Int pthread_setcanceltype(int type, int *oldtype),
- •31. Приостановка и повторный запуск нити.
- •32. Ожидание завершения нити
- •Int pthread_join(pthread_t tid, void** status).
- •33. Абстрактные критические секции.
- •34. Абстрактные двоичные семафоры.
- •35. Абстрактные семафоры с внутренним счетчиком.
- •36. Семафоры взаимоисключения в Windows.
- •37. Семафоры взаимоисключения в posix
- •Int pthread_mutex_lock(ptread_mutex_t* hmtx)
- •Int pthread_mutex_unlock(ptread_mutex_t* hmtx)
- •Int pthread_mutex_init( ptread_mutex_t *hmtx, ptread_mutexattr_*pattr)
- •38. Семафоры событий.
- •39. Средства множественных ожиданий
- •40. Программные семафоры с внутренним счетчиком в Windows.
30. Уничтожение (отмена) нитей
Средства управления нитями лучше всего развиты в современных версиях Unix, в частности в Linux. Прекращение работы нити по явному приказу другой нити является довольно решительной мерой, учитывая, что нити процесса выполняют общую работу. Поэтому уничтожение нити в общем случае может иметь непредусмотренный побочный эффект на результаты работы всего процесса. Эти соображения привели в Unix к введению средств, гибко управляющих возможностью уничтожения нити. В настоящее время такие средства состоят из двух вспомогательных функций pthread_setcanceltype() и pthread_setcancelstate() и состояний нити относительно возможности уничтожения. Переключение между отменяемыми состояниями и неотменяемым производится с помощью функции pthread_setcancelstate(), имеющей прототип
Int pthread_setcancelstate(int state, int *oldstate),
Переключение между асинхронно отменяемым и синхронно отменяемым состояниями нити задается функцией pthread_setcanceltype(), имеющей прототип
Int pthread_setcanceltype(int type, int *oldtype),
В Windows для уничтожения процессов служит системная функция TerminateThread, которая имеет прототип:
BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode)
31. Приостановка и повторный запуск нити.
В Unix для приостановки отдельной нити нужно использовать функцию pthread_kill со вторым параметром, задаваемым символической константой SIGSTOP, а для возобновления работы нити - ту же функцию, но уже с параметром SIGCONT.
Программные средства для приостановки и возобновления нитей в операционных системах типа Windows состоят из двух функций ResumeThread и SuspendThread. Обе они имеют единственный аргумент – хэндл нити, на которую они должны подействовать – приостановить или возобновить ее работу. Прототипы этих функций описываются в виде:
DWORD SuspendThread(HANDLE hthread)
DWORD ResumeThread(HANDLE hthread)
32. Ожидание завершения нити
Другой формой управления нитями внутри программы являются функции ожидания завершения нити. В определенной степени эта функция аналогична функциям ожидания окончания процессов, но относится к уровню нитей. В конечном счете, она предназначена для той же цели – согласования совместной работы нитей на основе самого глобального по смыслу действия – полного завершения работы отдельной выполняемой программной единицы.
В Unix, поддерживающей стандарт POSIX, для ожидания нити служит функция pthread_join, имеющая прототип
Int pthread_join(pthread_t tid, void** status).
В Windows для ожидания завершения нити служит уже частично рассматривавшаяся универсальная функция ожидания WaitForSingleObject. Для ожидания завершения нити в качестве первого аргумента этой функции следует взять хэндл ожидаемой нити, а в качестве второго – значение предельного времени ожидания, в простейшем случае INFINITE. Каких-либо особенностей, отличающих ее от других форм ожидания, эта функция не имеет при использовании для ожидания нити.
33. Абстрактные критические секции.
Если несколько процессов или нитей используют общие данные, то результат совместного использования этих данных может быть совершенно непредсказуем. Примером таких общих данных является использование общей для процессов очереди, куда эти процессы включают запрос на некоторое действие.
Введем некоторые термины, сложившиеся в теории параллельных процессов. Зависимость результатов процесса от непредусмотренного в программе взаимодействия с другими процессами называют состязанием процессов. Теоретическим средством устранить состязание между процессами является решение запретить прерывания, на основе которых организована параллельность процессов. Но такое решение запрещает (хотя бы на время) параллельное выполнение процессов, к тому же годится только для однопроцессорных систем.
Более общим понятием, чем общие данные является, понятие ресурса, которое кроме общих данных может быть и общедоступной аппаратурой. Участок программы, в котором нить производит обращение к общему (разделяемому с другими нитями) ресурсу, называется критическим интервалом нити.
Для устранения состязаний процессов (или нитей) используют монополизацию ресурса. Монополизация ресурса – это временное предоставление его в исключительное использование одной нити. Критический интервал нити поэтому ограничивают с начала и конца специальными управляющими конструкциями операционной системы, в абстрактном изложении называемыми прологом и эпилогом критического интервала. Назначение этих конструкций – обеспечить нахождение в критическом интервале только одной нити.