Ключевые слова:threads, (найти похожие документы)
Date: Wed, 9 May 2001 01:18:57 +0600 (TYUST)
From: XMan
Subject: Краткое описание pthread
Ага, значит не я один такой без мана на pthread :))
Все ниже сказанное касается Linux ! Как в других системах - незнаю.
Итак, pthread - это POSIX.1 вариант потоков выполнения (иногда называют нитями,
нонасколько это правильно). SUN-овский вариант, кажется, thr или thread. Для
работыпотоками определены N функций. В частности, pthread_create и pthread_exit.
int pthread_create(pthread_t *ID, pthread_attr_t *ATTR, void *(*ROUTINE) (void
*),*ARG)
создает поток, используя аттрибуты потока ATTR (NULL - по умолчанию). Потоком
являетсяvoid *ROUTINE(void *ARG), которой передается аргумент ARG. В ID
возвращаетсяидентифицирующая поток. В книге написано, что в качестве ID можно
подставлять
int pthread_exit(void RET_VAL)
завершение потока. Используется в функции-потоке ROUTINE при завершении работы.
Далее, поскольку все потоки и сам родитель работают с одной областью памяти, то
надоразделять доступ, чтобы они друг другу не мешали (например, при записи в
однуту же переменную). Для этого обычно используется три разновидности блокировок:
1. взаимоисключающая блокировка.
2. условные переменные.
3. семафоры.
Я использовал 1, остальное так и не пригодилось. Для работы с блокировками еть
таки
int pthread_mutex_init(pthread_mutex_t *LOCK,pthread_mutexattr_t *ATTR) -
инициируетLOCK (переменная типа pthread_mutex_t). ATTR пока не используется,
потомуNULL.
int pthread_mutex_destroy(pthread_mutex_t *LOCK) - удаляет блокировку LOCK.
int pthread_mutex_lock(pthread_mutex_t *LOCK) - блокирует остальные потоки.
int pthread_mutex_unlock(pthread_mutex_t *LOCK) - разблокирует остальные потоки.
int pthread_mutex_trylock(pthread_mutex_t *LOCK) - проверяет, можно ли
блокироватьВозвращает -1, если кто-то уже блокирует остальных.
Техника блокировок такая. Один поток вызывает ..._lock с аргументом LOCK и
продолжаетВ это время еще один поток вызывает ..._lock с агрументом LOCK. При
этомтех пор, пока первый поток не вызовет ..._unlock с аргументом LOCK, этот
поток(нет возврата из функции ..._lock). Таким образом, блокируются не данные,
апоток. блокировок в программе может быть несколько для более гибкого
распределения.когда есть 2 блока данных, с каждым из которых работают потоки
разныхимеет смысл создать 2 блокировки.
Все вышеперечисленные функции имеют тип int, через который обычно возвращается
код(-1).
Это самая что ни на есть основа. Там еще много чего есть. В частности,
аттрибутыприсоединенные и отсоединенные потоки. Но это лучше посмотреть в книге
попод UNIX.
-----------------------------------------------------------
Для закрытия подписки необходимо направить письмо по адресу
[email protected] с текстом "unsubscribe opentalk" в поле темы (subject) письма.
Толк есть. Я, например, могу уже создать, удалить и синхронизировать потоки. Но я хочу знать еще как остановить поток(pause) и продолжить его выполнение? А тут ничего про это нет :(
А вот в этом и облом... Если в win есть Suspend&Resume то здесь вам придется использовать Mutex+Conditional value...
Кста статья не только к Linux относится ) pthreads кросплатформенная либа, но не очень то удачная по сравнению с легковесными тридами солярки или бсд..