Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП теория 4 семестра - методичка слайдов Бранцевич Петр Юльянович 2009.doc
Скачиваний:
160
Добавлен:
15.06.2014
Размер:
1.75 Mб
Скачать

Int pthread_setschedparam(pthread_t tid, int policy, const struct sched_param *param);

Использование функции:

#include <pthread.h>

pthread_t tid;

int ret;

struct sched_param param;

int priority;

/* sched_priority указывает приоритет потока */

sched_param.sched_priority = priority;

/* единственный поддерживаемый алгоритм диспетчера*/

policy = SCHED_OTHER;

/* параметры диспетчеризации требуемого потока */

ret = pthread_setschedparam(tid, policy, &param);

pthread_setschedparam() возвращает 0 в случае успешного завершения, или другое значение в случае ошибки.

Функция:

Int pthread_getschedparam(pthread_t tid, int policy, struct schedparam *param);

позволяет получить приоритет любого существующего потока.

Пример вызова функции:

#include <pthread.h>

pthread_t tid;

sched_param param;

int priority;

int policy;

int ret;

/* параметры диспетчеризации нужного потока */

ret = pthread_getschedparam (tid, &policy, &param);

/* sched_priority содержит приоритет потока */

priority = param.sched_priority;

pthread_getschedparam() возвращает 0 - в случае успешного завершения - или другое значение - в случае ошибки.

Поток, как и процесс, может принимать различные сигналы:

#include <pthread.h>

#include <signal.h>

int sig;

pthread_t tid;

int ret;

ret = pthread_kill(tid, sig);

pthread_kill() посылает сигнал sig потоку, обозначенному tid, который должен быть потоком в пределах того же самого процесса, что и вызывающий поток. Аргумент sig должен быть действительным сигналом некоторого типа, определенного для функции signal() в файле < signal.h>.

Если sig имеет значение 0, выполняется проверка ошибок, но сигнал реально не посылается. Таким образом можно проверить правильность tid. Функция возвращает 0 - в случае успешного завершения - или другое значение - в случае ошибки.

Функция pthread_sigmask() может использоваться для изменения или получения маски сигналов вызывающего потока:

int pthread_sigmask(int how, const sigset_t *new, sigset_t *old);

Пример вызова функции:

#include <pthread.h>

#include <signal.h>

int ret;

sigset_t old, new;

 /* установка новой маски */

ret = pthread_sigmask(SIG_SETMASK, &new, &old);

 /* блокирование маски */

ret = pthread_sigmask(SIG_BLOCK, &new, &old);

 /* снятие блокировки */

ret = pthread_sigmask(SIG_UNBLOCK, &new, &old);

how определяет режим смены маски. Он принимает значения следующих констант:

SIG_SETMASK - заменяет текущую маску сигналов новой, при этом new указывает новую маску сигналов;

SIG_BLOCK - добавляет новую маску сигналов к текущей, при этом new указывает множество блокируемых сигналов;

SIG_UNBLOCK - удаляет new из текущей маски сигналов, при этом new указывает множество сигналов для снятия блокировки.

Если значение new равно NULL, то значение how не играет роли, и маска сигналов потока не изменяется. Чтобы узнать о блокированных в данный момент сигналах, аргумент new устанавливают в NULL. Переменная old указывает, где хранится прежняя маска сигналов, если ее значение не равно NULL.

Функция pthread_sigmask() возвращает 0 - в случае успешного завершения - или другое значение - в случае ошибки.

Остановка потока

Поток может прерваться несколькими способами. Первый способ предполагает возвращение управления из основной процедуры потока start_routine. Второй способ - вызов pthread_exit(), возвращающий статус выхода. Третий способ - прерывание потока с помощью функции pthread_cancel().

Функция void pthread_exit(void *status) прерывает выполнение потока точно так же, как функция exit() прерывает процесс:

#include <pthread.h>

int status;

 /* выход возвращает статус status */

pthread_exit(&status);

Функция pthread_exit() заканчивает выполнение вызвавшего ее потока. Все привязки данных для этого потока освобождаются. Если вызывающий поток не отделен, то ID этого потока и статус выхода (status) сохраняются, пока поток блокирован. В противном случае, статус игнорируется, а ID потока может быть немедленно использован для другого потока.

Функция pthread_cancel() предназначена для прерывания потока:

#include <pthread.h>

pthread_t thread;

int ret;

ret = pthread_cancel(thread);

Способ обработки запроса на прерывание потока зависит от состояния указанного потока. Две функции, pthread_setcancelstate() и pthread_setcanceltype(), определяют это состояние; функция pthread_cancel() возвращает 0 в случае успешного завершения, или другое значение в случае ошибки.