UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Рис. 26.5. Структуры данных после того, как поток n инициализировал свои собственные данные
6. Поток номер n продолжает выполнять функцию
readlineОдин вопрос, который мы пока не рассмотрели, заключается в следующем: что происходит, когда поток завершает свое выполнение? Если поток вызвал функцию
readlinepthread_key_createpkeypkeyKeyПервые две функции, которые обычно вызываются при работе с собственными данными потока, — это
pthread_oncepthread_key_create#include <pthread.h>int pthread_once(pthread_once_t *<i>onceptr</i>, void (*<i>init</i>)(void));int pthread_key_create(pthread_key_t *<i>keyptr</i>, void (*<i>destructor</i>)(void *<i>value</i>));<i>Обе функции возвращают: 0 в случае успешного выполнения, положительное значение Exxx в случае ошибки</i>Функция
pthread_oncepthread_onceonceptrinitФункция
pthread_key_createkeyptrОбычно эти две функции используются следующим образом (если игнорировать возвращение ошибок):
pthread_key_t rl_key;pthread_once_t rl_once = PTHREAD_ONCE_INIT;void readline_destructor(void *ptr) { free(ptr);}void readline_once(void) { pthread_key_create(&rl_key, readline_destructor);}ssize_t readline(...) { ... pthread_once(&rl_once, readline_once); if ((ptr = pthread_getspecific(rl_key)) == NULL) { ptr = Malloc(...); pthread_setspecifiс(rl_key, ptr); /* инициализация области памяти, на которую указывает ptr */ } ... /* используются значения, на которые указывает ptr */}Каждый раз, когда вызывается функция
readlinepthread_onceonceptrrl_onceinitreadline_oncerl_keyreadlinepthread_getspecificpthread_setspecificФункции
pthread_getspecificpthread_setspecific#include <pthread.h>void *pthread_getspecific(pthread_key_t <i>key</i>);<i>Возвращает: указатель на собственные данные потока (возможно, пустой указатель)</i>int pthread_setspecific(pthread_key_t <i>key</i>, const void *<i>value</i>);<i>Возвращает: 0 в случае успешного выполнения, положительное значение Exxx в случае ошибки</i>Обратите внимание на то, что аргументом функции
pthread_key_creategetsetПример: функция readline, использующая собственные данные потока
В этом разделе мы приводим полный пример использования собственных данных потока, преобразуя оптимизированную версию функции
readlineВ листинге 26.5 показана первая часть функции: переменные
pthread_key_tpthread_once_treadline_destructorreadline_onceRline
