в разработке
Объект задающий атрибуты потока имеет тип 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(...);
Условная переменная должна быть инициализирована функцией
А ресурсы, занятые ей, могут быть освобождены функцией