Вот пример вызова этой функции:
pthread_t ThreadId;
ThreadId = pthread_self();
Поток вызывает функцию pthread_self(),а значение, возвращаемое ею (идентификатор потока), сохраняет в переменной ThreadIdтипа pthread_t.
Функция pthread_join() используется для присоединения или воссоединения потоков выполнения в одном процессе. Эта функция обеспечивает приостановку выполнения вызывающего потока до тех пор, пока не завершится заданный поток. По своему Действию эта функция аналогична функции wait(), используемой процессами. Эту функцию может вызвать создатель потока, после чего он будет ожидать до тех пор, пока не завершится новый (созданный им) поток, что, образно говоря, можно назвать воссоединением потоков выполнения. Функцию pthread_join()могут также вызывать равноправные потоки, если потоковый дескриптор является глобальным. Это позволяет любому потоку соединиться с любым другим потоком выполнения в процессе. Если вызы вающий поток аннулируется до завершения заданного (для присоединения) потока,этот заданный поток не станет открепленным (detached) потоком (см. следующий раздел) Если различные равноправные потоки одновременно вызовут функцию pthread_join() для одного и того же потока, его дальнейшее поведение не определено.
Синопсис
#include
int pthread_join(pthread_t thread, void **value_ptr);
Параметр threadпредставляет поток, завершения которого ожидает вызывающий поток. При успешном выполнении этой функции в параметре value_ptrбудет записан статус завершения потока. Статус завершения — это аргумент, передаваемый при вызове функции pthread_exit() завершаемым потоком. При неудачном выполнении эта функция возвратит код ошибки. Функция не будет выполнена успешно, если заданный поток не является присоединяемым, т.е. создан как открепленный. Об успешном выполнении этой функции не может быть и речи, если заданный поток попросту не существует.
Функцию pthread_join() необходимо вызывать для всех присоединяемых потоков. После присоединения потока операционная система сможет снова использовать память, которую он занимал. Если присоединяемый поток не был присоединен ни к одному потоку или если поток, который вызывает функцию присоединения, аннулируется, то заданный поток будет продолжать использовать свою память. Это состояние аналогично зомбированному процессу, в которое переходит сыновний процесс, когда его родитель не принимает статус завершения потомка, и этот «беспризорный» сыновний процесс продолжает занимать структуру в таблице процессов.
Создание открепленных потоков
Открепленным называется завершаемый поток, который не присоединился или завершения которого не дождался другой поток. При завершении потока ограниченные ресурсы, которые он использовал, включая его идентификатор, освобождаются и возвращаются системе. Потокам нет необходимости получать статус завершения. Попытка со стороны любого потока вызвать функцию pthread_join() для открепленного потока обречена на неудачу. Существует функция pthread_detach(), которая открепляет поток, заданный параметром thread .По умолчанию все потоки создаются как присоединяемые, если атрибутным объектом не обусловлено иное. Эта функция позволяет открепить уже существующие присоединяемые потоки. Если поток не завершен, обращение к этой функции не обеспечит его завершения.
Синопсис
#include
int pthread_detach(pthread_t thread thread);
При успешном выполнении эта функция возвращает число 0 ,в противном случае— код ошибки. Функция pthread_detach()не будет успешной, если заданный поток уже откреплен или поток, заданный параметром thread,не был обнаружен.
Вот пример открепления уже существующего присоединяемого потока:
pthread_create(&threadA,NULL,taskl,NULL);
pthread_detach(threadA);
При выполнении этих строк кода поток threadA станет открепленным. Чтобы создать открепленный поток (в противоположность динамическому откреплению потока) необходимо установить атрибут detachstate в объекте атрибутов потока и использовать этот объект при создании потока.
Использование объекта атрибутов
Объект атрибутов инкапсулирует атрибуты потока или группы потоков. Он используется для установки атрибутов потоков при их создании. Атрибутный объект потока имеет тип pthread_attr_t. Он представляет собой структуру, позволяющую хранить следующие атрибуты:
Читать дальше