UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Рис. 26.5. Структуры данных после того, как поток n инициализировал свои собственные данные
6. Поток номер n продолжает выполнять функцию
readline
Один вопрос, который мы пока не рассмотрели, заключается в следующем: что происходит, когда поток завершает свое выполнение? Если поток вызвал функцию
readline
pthread_key_create
pkey
pkey
Key
Первые две функции, которые обычно вызываются при работе с собственными данными потока, — это
pthread_once
pthread_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_once
pthread_once
onceptr
init
Функция
pthread_key_create
keyptr
Обычно эти две функции используются следующим образом (если игнорировать возвращение ошибок):
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 */
}
Каждый раз, когда вызывается функция
readline
pthread_once
onceptr
rl_once
init
readline_once
rl_key
readline
pthread_getspecific
pthread_setspecific
Функции
pthread_getspecific
pthread_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_create
get
set
Пример: функция readline, использующая собственные данные потока
В этом разделе мы приводим полный пример использования собственных данных потока, преобразуя оптимизированную версию функции
readline
В листинге 26.5 показана первая часть функции: переменные
pthread_key_t
pthread_once_t
readline_destructor
readline_once
Rline