
- •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.
28. Создание нитей (thread) в программахWindows.
Главная нить процесса создается автоматически при создании процесса. Если процесс нуждается в доп-х нитях, то его прога вызывает системные ф-ции создания нити.
Наиболее сложная ситуация оказывается с порождением нитей в операционных системах Windows. И дело все в том, что для порождения нитей в этих системах имеется не одна функция, а несколько. Самой ранней является системная функция CreateThread, но в ее реализации при использовании на языке программирования Си позже были обнаружены некоторые проблемы некорректного поведения и было предложено заменить ее функцией _begintread.
К настоящему времени наиболее безопасными функциями порождения нитей являются _beginthreadNT и _beginthreadex, именно их и рассмотрим в первую очередь, предлагая для ближайшего использования.
unsigned long _beginthreadex(void* security_attrib, unsigned stack_size, unsigned (*proc)(void*), void *arglist, unsigned flag, unsigned *tid)
unsigned long _beginthreadNT(void (*proc)(void *), unsigned stack_size, void *arglist, void *security_attrib, unsigned long flags, unsigned long *tid)
proc – процедура нити
stack_size – размер стека, практически округляется до 4096
arglist – указатель на строку аргументов
security_attrib – применятеся в сложных программах
flags – служит для приостанвления только что созданной нити
tid – указатель на идентификатор
Исходной системной функцией для построения всех описанных функций создания нитей в Windows служит функция CreateThread, которой можно пользоваться в тех программах, процедуры задания нитей которых не содержат стандартных функций базовой библиотеки языка Си и неявно не используют их.
29. Создание posiXнитей в программе.
Главная нить процесса создается автоматически при создании процесса. Если процесс нуждается в дополнительных нитях, то его программа вызывает системные функции создания нити.
В операционной системе Unix многопоточное программирование появилось достаточно поздно. К настоящему времени эта возможность входит в стандарт POSIX для Unix и поддерживается во всех современных ОС. Использование нитей при этом требует подключения заголовочного файла pthread.h. Системная функция создания нити в Unix по указанному стандарту имеет прототип
Int pthread_create(pthread_t* tid, const pthread_attr_t* att, void*(*fun)(void*), void* argp)
tid – возвращает идентификатор созданной нити
att – задание атрибутов отличных от умолчания
fun - адрес процедуры нити
arg - для передачи конкретного аргумента при создании нити
Если функци создания нити возвращает значение >0, то в ходе выполнения системной функции произошла ошибка, и нить не была создана. Эту ситуацию рекомендуется анализировать в программе. Нулевое возвращаемое значение соответствует безошибочному выполнению, а положительное значение выдает непосредственно числовое значение кода ошибки. Для завершения:
Int pthread_exit(void *status)
Указанная функция требуется только, если эта нить должна передавать код завершения или при задании завершения внутри программы процедуры. На конечном месте процедуры вызов функции завершения можно опускать.