Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мои шпоры ОСиСП(1).doc
Скачиваний:
32
Добавлен:
26.09.2019
Размер:
1.63 Mб
Скачать

Билет 26

1. Поток в ос unix. Синхронизация потоков, получение информации о потоке.

Для организации параллельного выполнения и взаимодействия процессов можно использовать механизм многопоточности. Основной единицей здесь является поток. Поток представляет собой облегченную версию процесса. Основной библиотекой для реализации пользовательских потоков является библиотека потоков POSIX, которая называется pthreads.

Однопоточные программы на C содержат два основных класса данных: локальные и глобальные. Для многопоточных программ на C добавляется третий класс: данные потока. Данные потока являются единственным способом определения и обращения к данным, которые принадлежат отдельному потоку. Каждый элемент данных потока связан с ключом, который является глобальным для всех потоков процесса. Используя ключ, поток может получить доступ к указателю (void *), который поддерживается только для этого потока. Функция pthread_keycreate() применяется для выделения ключа, который используется при идентифицикации данных некоторого потока в составе процесса. Ключ для всех потоков общий, и все потоки вначале содержат значение ключа NULL. Отдельно для каждого ключа перед его использованием вызывается pthread_keycreate(). При этом не происходит никакой синхронизации. Как только ключ будет создан, каждый поток может связать с ним свое значение. Значения являются специфичными для потока и поддерживаются для каждого из них независимо. Связь ключа с потоком удаляется, когда поток заканчивается, при этом ключ должен быть создан с функцией деструктора.

Int pthread_key_create(pthread_key_t *key, void(*destructor)(void *));

Если pthread_keycreate() завершается успешно, то выделенный ключ будет сохранен в переменной key. Вызывающий процесс должен гарантировать, что хранение и доступ к этому ключу синхронизированы. Чтобы освободить ранее выделенную память, может использоваться дополнительная функция удаления - деструктор. Если ключ имеет непустой указатель на функцию деструктора, и поток имеет непустое значение ключа, функция деструктора вызывается для значения, связанного с потоком, после его завершения. Порядок, в котором вызываются функции деструктора, может быть произвольным; pthread_keycreate() возвращает 0 при успешном завершении, или любое другое значение при возникновении ошибки.

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

int pthread_key_delete(pthread_key_t key);

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

Функция pthread_setspecific() используется, чтобы установить связку между потоком и указанным ключом данных для потока. Прототип функции:

int pthread_setspecific(pthread_key_t key, const void *value);

возвращает 0 - после успешного завершения - или любое другое значение - в случае ошибки; она не освобождает память для хранения ключа. Если установлена новая привязка значения ключа, предыдущая привязка должна быть освобождена; иначе может произойти утечка памяти.

Чтобы получить привязку ключа для вызывающего потока, используется функция^

int pthread_getspecific(pthread_key_t key);

Функция pthread_self()

#include <pthread.h>

pthread_t pthread_self(void);

Функция pthread_self возвращает идентификатор текущей нити (потока) исполнения.

#include <pthread.h>

int pthread_equal(pthread_t t1, pthread_t t2);

Как и другие функции сравнения, pthread_equal() возвращает значение, отличное от нуля, когда t1 и t2 равны; иначе возвращается 0. Если t1 или t2 - недействительный идентификатор потока, результат функции будет неопределенным.

int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));

используется для вызова процедуры инициализации потока только один раз. Последующие вызовы не оказывают никакого эффекта.

Функция sched_yield() приостанавливает текущий поток, чтобы процессор переключился на другой поток с тем же самым или большим приоритетом. После успешного завершения sched_yield() возвращает 0. Если возвращается -1, то системная переменная errno устанавливается на код ошибки.

Функция pthread_setschedparam() используется, чтобы изменить приоритет существующего потока. Эта функция никоим образом не влияет на дисциплину диспетчеризации:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]