FIXME в разработке

Процессы, потоки

Определения

Примитивы pthreads

Создание
Атрибуты

Объект задающий атрибуты потока имеет тип pthread_attr_t. Такой объект должен быть инициализирован с помощью функции

В результате объект будет содержать набор свойств потока по умолчанию для данной реализации потоков. А ресурсы, которые могут использоваться в системе для хранения этих атрибутов освобождаются вызовом функции (после того, как объект был использован в вызове pthread_create и больше не нужен)

Присоединение и отрыв

Поток может быть “присоединяемым” (joinable) или “оторванным” (detached). Для установки этого свойства в атрибутах используется функция

где detachstate можно установить в PTHREAD_CREATE_JOINABLE или в PTHREAD_CREATE_DETACHED соответственно. Присоединяемые и оторванные потоки

Для каждого присоединяемого потока, один из других потоков явно должнен вызвать функцию

Поток, вызвавший эту функцию, останавливается, пока не окончится выполнение потока thread. Если никто не вызывает pthread_join для присоединяемого потока, то завершившись, он не освобождает свои ресурсы, а это может служить причиной утечки памяти в программе. value_ptr (OUT) – это указатель на указатель, возвращенный функцией завершившегося потока.

Взаимное исключение потоков

Для организации взаимного исключения потоков при доступе к разделяемым данным используются мьютексы (mutex = mutual exclusion), объекты типа pthread_mutex_t. Мьютекс должен быть инициализирован перед использованием с помощью функкции

Для захвата мьютекса поток использует (см. пример) функцию

а для освобождения

Условные переменные

Поясним использование условных переменных на примере. Например, поток номер 1 должен выполнить некоторые действия, когда значение некоторого глобального счетчика counter достигнет критического значения criticalVal, причем значение счетчика меняет поток номер 2. Тогда, чтобы первый поток не крутился в цикле, все время проверяя значение counter, можно использовать условную переменную, с помощью которой поток номер 1 устанавливается в состояние ожидания до тех пор, пока поток номер 2 не просигналирует о наступлении нужного события:

pthread_mutex_t mutex;
//условная переменная
pthread_cond_t cond;
//счетчик
int counter = 0;
//захват мьютекса
pthread_mutex_lock(&mutex);
//если значение не равно критическому
if(counter!=criticalValue)
//останавливаемся в ожидании этого события.
//При этом мьютекс будет разблокирован. Как только событие наступит, 
//и мьютекс будет отпущен вторым потоком,
//мьютекс снова захватывается и выполнение потока 1 продолжается
    pthread_cond_wait(&cond, &mutex);
//обработка критического значения
processCriticalValue();
//освобождение мьютекса
pthread_mutex_unlock();
do
{
...
//захват мьютекса
pthread_mutex_lock(&mutex);
//изменение значения счетчика
doSomethingWith(&counter);
//если событие наступило
if(counter==criticalValue)
//просигналировать об этом ждущим на условной переменной cond
    pthread_cond_signal(&cond);
//отпустить мьютекс
pthread_mutex_unlock(&mutex);
...
}while(...);

Условная переменная должна быть инициализирована функцией

А ресурсы, занятые ей, могут быть освобождены функцией