Книга: UNIX: разработка сетевых приложений
Функции, безопасные в многопоточной среде
Функции, безопасные в многопоточной среде
Стандарт POSIX.1 требует, чтобы все определенные в нем функции, а также функции, определенные в стандарте ANSI С, были безопасными в многопоточной среде. Исключения из этого правила приведены в табл. 26.1.
К сожалению, в POSIX.1 ничего не сказано о безопасности в многопоточной среде по отношению к функциям сетевого API. Последние пять строк в этой таблице появились благодаря Unix 98. В разделе 11.18 мы говорили о том, что функции gethostbyname
и gethostbyaddr
не допускают повторного вхождения. Как уже отмечалось, некоторые производители определяют версии этих функций, обладающие свойством безопасности в многопоточной среде (их названия заканчиваются на _r
), но поскольку они не стандартизованы, лучше от них отказаться. Все функции getXXX
, не допускающие повторного вхождения, были приведены в табл. 11.5.
Таблица 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 |
Приведенная таблица позволяет заключить, что общим способом сделать функцию допускающей повторное вхождение является определение новой функции с названием, оканчивающимся на _r
. Обе функции будут безопасными в многопоточной среде, только если вызывающий процесс выделяет в памяти место для результата и передает соответствующий указатель как аргумент функции.
- Аргументы функции в Python
- 3. Функции
- Новые функции API для работы с Blob и массивами
- Математические функции
- Размытые функции
- 7.3. Финансовые функции
- 4.3. Логические функции и таблицы истинности
- B1.7. Функции обработки ошибок
- 9.1.4.2. Функции-оболочки: execl() и др.
- 11.5. Функции getservbyname и getservbyport
- Функции dup(2) и dup2(2)
- Применение функции scanf( )