Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы / часы_таймеры_потоки.DOC
Скачиваний:
33
Добавлен:
01.05.2014
Размер:
351.23 Кб
Скачать

13.1. Структура и методика использования потоков выполнения

Поток выполнения состоит из следующих элементов:

• идентификатора потока;

• динамического стека;

• набора регистров (счетчик команд, указатель стека);

• сигнальной маски;

• значения приоритета;

• специальной памяти.

Поток выполнения создается функцией thr_create (в POSIX. 1с — pthreacl_creafe). Каждому потоку присваивается идентификатор, уникальный среди всех потоков процесса. Вновь созданный поток наследует сигнальную маску процесса, динамический стек, значение приоритета и набор регистров. Динамический стек и регистры (счетчик команд и указатель стека) позволяют потоку выполняться независимо от других потоков. Поток может изменить унаследованную сигнальную маску и выделить динамическую память для хранения своих данных. Потоку при создании назначается соответствующая функция, поток завершается, когда эта назначенная функция возвращает результат или когда поток вызывает функцию thr_exit (в POSIX.lc — pthread_exit). Когда в процессе создается первый поток, то фактически создаются два потока один — для выполнения указанной функции, а другой ~ для продолжения выполнения процесса. Последний поток завершается, когда функция main возвращает результат или он сам вызывает функцию thr_exit.

Все потоки в процессе совместно используют одни сегменты даных и кода. Когда один поток записывает данные в глобальные переменные в процессе, остальные потоки сразу же видят эти изменения. Если какой-либо поток вызывает API exit или API exec, то завершаются все потоки и сам процесс. Поэтому завершающийся поток, если он не хочет разрушить процесс, в котором выполняется, должен вызывать функцию thr exit

Поток может изменить свою сигнальную маску с помощью функции thr_sigsetmask (в POSIX.lc — pthread_sigmask). Сигнал, передаваемый процессу, получат все потоки, которые не замаскировали его. Поток может посылать сигналы в другие потоки этого же процесса, используя функцию thr_kill (в POSIX.lc — plhread_kill), но не может посылать сигналы в потоки другого процесса, так как уникальность идентификаторов потоков не распространяется на другие процессы. Для настройки собственного механизма обработки сигналов поток может использовать API signal или sigaction.

Потоку присваивается целочисленное значение приоритета. Чем больше это значение, тем чаще планируемое выполнение потока. Значение приоритета потока можно запросить с помощью функции thr_getprio и изменить с помощью функции thr_setprio (в POSIX.lc — pthread_attr_getschedparam и pthread_attr_setschedparam соответственно). Поток может намеренно передать выполнение другим потокам с таким же приоритетом; для этого используется функция thr_yield (в POSIX.lc — sched_yield). Кроме того, поток может ожидать завершения другого потока и получить его код возврата с помощью функции thr_join (в POSIX.lc — pthread_join).

В API фирмы Sun поток может, пользуясь функциями thr_suspend и thr_continue, приостанавливать и возобновлять выполнение другого потока. Если какая-то функция выполняется множеством потоков и содержит статические или глобальные переменные, которые используются разными потоками, нужно создать специальную память для хранения этих фактических данных по каждому потоку. Эта специальная память выделяется с помощью функций thr _keycreate, thr _setspecific и thr_getspecific.

Соседние файлы в папке Материалы