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