UNIX: разработка сетевых приложений
Шрифт:
Исторически функции
Функции, безопасные в многопоточной среде
Стандарт POSIX.1 требует, чтобы все определенные в нем функции, а также функции, определенные в стандарте ANSI С, были безопасными в многопоточной среде. Исключения из этого правила приведены в табл. 26.1.
К сожалению, в POSIX.1 ничего не сказано о безопасности в многопоточной среде по отношению к функциям сетевого API. Последние пять строк в этой таблице появились благодаря Unix 98. В разделе 11.18 мы говорили о том, что функции
Таблица 26.1. Функции, безопасные в многопоточной среде
Могут не быть безопасными в многопоточной среде | Должны быть безопасными в многопоточной среде | Комментарии |
---|---|---|
Asctime | asctime_r | Безопасна в многопоточной среде только в случае непустого аргумента |
ctermid | ||
Ctime | ctime_r | |
getc_unlocked | ||
getchar_unlocked | ||
Getgrid | getgrid_r | |
Getgrnam | getgrnam_r | |
Getlogin | getlogin_r | |
Getpwnam | getpwnam_r | |
Getpwuid | getpwuid_r | |
Gmtime | gmtime_r | |
Localtime | localtime_r | |
putc_unlocked | ||
putchar_unlocked | ||
Rand | rand_r | |
Readdir | readdir_r | |
Strtock | strtock_r | |
tmpnam | Безопасна
| |
Ttyname | ttyname_r | |
GethostXXX | ||
GetnetXXX | ||
GetprotoXXX | ||
GetservXXX | ||
inet_ntoa |
Приведенная таблица позволяет заключить, что общим способом сделать функцию допускающей повторное вхождение является определение новой функции с названием, оканчивающимся на
26.5. Собственные данные потоков
При преобразовании существующих функций для использования в многопоточной среде часто возникают проблемы, связанные со статическими переменными. Функция, сохраняющая состояние в собственном буфере или возвращающая результат в виде указателя на статический буфер, не является безопасной в многопоточной среде, поскольку несколько потоков не могут использовать один и тот же буфер для хранения разных данных. Такая проблема имеет несколько решений.
1. Использование собственных данных потоков (thread-specific data). Это нетривиальная задача, и функция при этом преобразуется к такому виду, что может использоваться только в системах, поддерживающих потоки. Преимущество этого подхода заключается в том, что не меняется вызывающая последовательность, и все изменения связаны с библиотечной функцией, а не с приложениями, которые вызывают эту функцию. Позже в этом разделе мы покажем безопасную в многопоточной среде версию функции
2. Изменение вызывающей последовательности таким образом, чтобы вызывающий процесс упаковывал все аргументы в некую структуру, а также записывал в нее статические переменные из листинга 3.12. Это также было сделано, и в листинге 26.4 показана новая структура и новые прототипы функций.
Листинг 26.4. Структура данных и прототип функции для версии функции readline, допускающей повторное вхождение
Меняя маски
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
рейтинг книги
![Меняя маски](https://style.bubooker.vip/templ/izobr/no_img2.png)