Ага, значит не я один такой без мана на 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 *), void *ARG)
создает поток, используя аттрибуты потока ATTR (NULL - по умолчанию). Потоком является функция void *ROUTINE(void *ARG), которой передается аргумент ARG. В ID возвращается структура, идентифицирующая поток. В книге написано, что в качестве ID можно подставлять NULL.
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.