[linux] errno и POSIX threads

sergey_m

Взял Debian и Dead Rat и вижу в errno(3):


errno is defined by the ISO C standard to be a modifiable lvalue of type
int, and must not be explicitly declared; errno may be a macro. errno is
thread-local; setting it in one thread does not affect its value in any
other thread.


Кто нибудь может объяснить как такое может быть - что бы обычная глобальная переменная была разной в разных тредах?

shlyumper

Ключевой момент:
must not be explicitly declared; errno may be a macro.

смотрим bits/errno.h:


# if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value. */
# define errno (*__errno_location
# endif
# endif /* !__ASSEMBLER__ */
#endif /* _ERRNO_H */

Ivan8209

А где написано, что она глобальная?
---
...Я работаю антинаучным аферистом...

sergey_m

Но при этом она перестает быть lvalue.

shlyumper

Нифига не перестает. Вчитайся в код. Там просто dereference указателя, возвращаемого функцией происходит. А эта операция возвращает вполне себе lvalue.

sergey_m

Действительно. Спасибо.

evgeha

Есть такая штука в позиксе. Там есть еще много извратов.
http://users.actcom.co.il/~choo/lupg/tutorials/multi-thread/multi-thread.html#thread_tss

sergey_m

Я не нашел в SUSv3 ничего о взаимодействии errno и threads. По-моему реализация __errno в FreeBSD или Linux это просто самодеятельность, которая конечно очень полезна.
По твоей ссылке я нашел ничего нового. То, что __errno пользуется pthread_key_create очевидно.
Оставить комментарий
Имя или ник:
Комментарий: