LINUX.ORG.RU

локальные данные потоков POSIX


0

0

Поясните пожалуйста смысл существования набора функций типа pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific? Чем не устраивают локальные автоматические переменные в главной функции потока и как с помощью этого скрытно решается проблема глобальной переменной errno?

Это нужно для определения глобальных переменных, специфичных для потока. Например, как errno. Как ее можно реализовать локальной переменной? Разве что только на всю глубину вызова всех функций передавать параметром указатель на нее.

Вот для отсутствия такого гемора и нужно thread local storage.

vega
()
Ответ на: комментарий от vega

Не я эту теорию уже в шести местах успел прочитать, вы мне пример кода определяющий глобальную переменную с использование ЭТОГО дать можете?

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> Не я эту теорию уже в шести местах успел прочитать, вы мне пример кода определяющий глобальную переменную с использование ЭТОГО дать можете?

Тебе же уже сказали про errno:

extern int *__errno_location (void) __THROW __attribute__ ((__const__));
#define errno (*__errno_location ())

Или ты не понял как использовать эти функции и просишь простой пример? Он есть в man pthread_key_create =).

Deleted
()
Ответ на: комментарий от Deleted

Что-то подобное я и ожидал. Тот пример я уже просмотрел. В свете функционально программирования С смысл этих функций вполне понятен, понятно даже почему нельзя обязать создавать все ключи до создания потоков и почему пришлось изобретать велосипед с pthread_once. Вопрос возник на фоне того что в многопоточном объектно ориентированном программировании на С++ смысл всего этого бубна долеко не очебиден если не сказать что он просто бесполезен. Уточню последний нюанс: pthread_key_create ведь не обязательно вызавать после того как созданы все потоки и это можно сделать загодя, так?

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> В свете функционально программирования С

процедурного

Почему же. В объектно-ориентированном языке java есть прямой аналог thread-specific данным, ThreadLocal. В принципе, этот функционал можно заменить глобальным списком указателей на тред-специфичные данные, элемент на каждый tid. Задача иметь подобное хранилище частая, сделали для неё удобную абстракцию в библиотеке.

DrLivsy
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.