Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций 2009.doc
Скачиваний:
58
Добавлен:
13.11.2019
Размер:
2.3 Mб
Скачать

3.7.3Потоки unix. Функции потоков стандарта posix.

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

Таблица 3.3. Функции потоков стандарта POSIX

Вызов

Описание

pthread_create

Создать новый поток в адресном пространстве вызывающего процесса

pthread_exit

Завершать вызывающий процесс

pthread_join

Подождать, пока не завершиться процесс

pthread_mutex_init

Создать новый мьютекс

pthread_ mutex_destroy

Уничтожить мьютекс

pthread_ mutex_lock

Заблокировать мьютекс

pthread_ mutex_unlock

Разблокировать мьютекс

pthread_ cond _init

Создать условную переменную

pthread_cond_destroy

Уничтожить условную переменную

pthread_cond_wait

Ждать условную переменную

pthread_cond_signal

Разблокировать один поток, ждущий условную переменную

Обращение к первому системному вызову производится следующим образом:

err= pthread_create(&tid, attr, function, arg);

Вызов создает новый поток, в котором работает функция function, а arg передается программе function в качестве параметра. Идентификатор нового потока хранится в памяти по адресу, в котором хранится первый поток. С помощью attr можно задавать для нового потока новые атрибуты, такие как приоритеты планирования. После успешного выполнения в адресном пространстве пользователя появляется на один поток больше.

Заголовок функции потока имеет следующий вид:

void * func_name(void * arg)

Функция pthread_exit() представляет собой потоковый аналог функции _exit(). Аргумент функции pthread_exit(), значение типа void *, становится возвращаемым значением функции потока. Как (и кому?) функция потока может вернуть значение, если она не вызывается из программы явным образом? Для того, чтобы получить значение, возвращенное функцией потока, нужно воспользоваться функцией pthread_join(3). У этой функции два параметра. Первый параметр pthread_join(), – это идентификатор потока, второй параметр имеет тип «указатель на нетипизированный указатель». В этом параметре функция pthread_join() возвращает значение, возвращенное функцией потока. Конечно, в многопоточном приложении есть и более простые способы организовать передачу данных между потоками. Основная задача функции pthread_join() заключается, однако, в синхронизации потоков. Вызов функции pthread_join() приостанавливает выполнение вызвавшего ее потока до тех пор, пока поток, чей идентификатор передан функции в качестве аргумента, не завершит свою работу. Если в момент вызова pthread_join() ожидаемый поток уже завершился, функция вернет управление немедленно. Функцию pthread_join() можно рассматривать как эквивалент waitpid(2) для потоков. Эта функция позволяет вызвавшему ее потоку дождаться завершения работы другого потока. Попытка выполнить более одного вызова pthread_join() (из разных потоков) для одного и того же потока приведет к ошибке.