UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
3. Реструктуризация интерфейса для исключения статических переменных и обеспечения безопасности функции в многопоточной среде. Для
readlineИспользование собственных данных потоков — это распространенный способ сделать существующую функцию безопасной в многопоточной среде. Прежде чем описывать функции Pthread, работающие с такими данными, мы опишем саму концепцию и возможный способ реализации, так как эти функции кажутся более сложными, чем являются на самом деле.
Частично осложнения возникают по той причине, что во всех книгах, где идет речь о потоках, описание собственных данных потоков дается по образцу стандарта Pthreads. Пары ключ-значение и ключи рассматриваются в них как непрозрачные объекты. Мы описываем собственные данные потоков в терминах индексов и указателей, так как обычно в реализациях в качестве ключей используются небольшие положительные целые числа (индексы), а значение, ассоциированное с ключом, — это просто указатель на область памяти, выделяемую потоку с помощью функции
mallocВ каждой системе поддерживается ограниченное количество объектов собственных данных потоков. В POSIX требуется, чтобы этот предел не превышал 128 (на каждый процесс), и в следующем примере мы используем именно это значение. Система (вероятно, библиотека потоков) поддерживает один массив структур (которые мы называем структурами
Key
Рис. 26.2. Возможная реализация собственных данных потока
Флаг в структуре
Keypthread_key_createKeyKeyВ дополнение к массиву структур
KeyPthreadpkey
Рис. 26.3. Информация, хранящаяся в системе для каждого потока
Все элементы массива
pkeyКогда мы с помощью функции
pthread_key_createmallocТеперь мы перейдем к примеру применения собственных данных потока, предполагая, что наша функция
readlinereadline1. Запускается процесс, и создается несколько потоков.
2. Один из потоков вызовет функцию
readlinephtread_key_createKeyМы будем использовать функцию
pthread_oncepthread_key_createreadline3. Функция
readlinepthread_getspecificpkey[1]readlinemallocreadlinereadlinepthread_setspecificpkey[1]
Рис. 26.4. Соответствие между областью памяти, выделенной функцией malloc, и указателем собственных данных потока
На этом рисунке мы отмечаем, что структура Pthread поддерживается системой (вероятно, библиотекой потоков), но фактически собственные данные потока, которые мы размещаем в памяти с помощью функции
mallocreadlinepthread_setspecificpthread_getspecific4. Другой поток, например поток с номером
nreadlinereadlineФункция
readlinepthread_once5. Функция
readlinepthread_getspecificpkey[1]mallocpthread_setspecific
