Вопрос

Начиная с pthreads, не могу понять, что там с pthread_key_t и pthread_once_t?

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

Спасибо

Это было полезно?

Решение

Нет, это невозможно объяснить с точки зрения непрофессионала.Непрофессионалы не могут успешно программировать с использованием pthreads на C++.Нужен специалист, известный как «программист» :-)

pthread_once_t это немного места для хранения, которое pthread_once должен получить доступ, чтобы убедиться, что он делает то, что указано на банке.Каждый элемент управления Once позволяет вызвать процедуру инициализации один и только один раз, независимо от того, сколько раз она вызывается из скольких потоков, возможно одновременно.Обычно вы используете разные элементы управления Once для каждого объекта, который планируете инициализировать по требованию потокобезопасным способом.По сути, вы можете думать об этом как о целом числе, доступ к которому осуществляется атомарно, как о флаге, был ли выбран поток для выполнения инициализации.Но с тех пор pthread_once блокирует, я думаю, что это может быть немного больше, чем это, если реализация также может втиснуть примитив синхронизации (единственный раз, когда я когда-либо реализовал pthread_once, Я не смог, поэтому однажды элемент управления принял любое из трех состояний (запуск, инициализация, завершение).Но тогда я не смог сменить ядро.Необычная ситуация).

pthread_key_t похож на индекс для доступа к локальному хранилищу потоков.Вы можете думать о каждом потоке как о карте ключей и значений.Когда вы добавляете новую запись в TLS, pthread_key_create выбирает для него ключ и записывает этот ключ в указанное вами место.Затем вы используете этот ключ из любого потока всякий раз, когда хотите установить или получить значение этого элемента TLS для текущего потока.Причина, по которой TLS дает вам ключ вместо того, чтобы позволить вам выбрать его, заключается в том, что несвязанные библиотеки могут использовать TLS без необходимости сотрудничать, чтобы избежать использования одного и того же значения и уничтожения данных TLS друг друга.Библиотека pthread может, например, хранить глобальный счетчик и впервые назначить ключ 0. pthread_key_create называется, 1 для второго и так далее.

Другие советы

pthread_key_t это для создания темы локальное хранилище потока:каждый поток получает свою собственную копию переменной данных вместо того, чтобы все потоки совместно использовали глобальную (или функционально-статическую, класс-статическую) переменную.TLS индексируется по ключу.Видеть pthread_getspecific и др. для более подробной информации.

pthread_once_t представляет собой элемент управления для выполнения функции только один раз с помощью pthread_once.Предположим, вам нужно вызвать процедуру инициализации, но вызвать ее нужно только один раз.Более того, момент, когда вы должны его вызвать, — это после того, как вы уже запустили несколько потоков.Одним из способов сделать это было бы использовать pthread_once(), что гарантирует, что ваша подпрограмма будет вызываться только один раз, независимо от того, сколько потоков попытается вызвать ее одновременно, при условии, что вы используете одну и ту же управляющую переменную в каждом вызове.Зачастую проще использовать pthread_once() чем использовать другие альтернативы.

Ух ты, другие ответы здесь слишком многословны.

pthread_once_t хранит состояние для pthread_once().Вызов pthread_once(&s, fn) звонки fn и устанавливает значение, на которое указывает s зафиксировать факт его исполнения.Все последующие обращения к pthread_once() нуп.Теперь имя должно стать очевидным.

pthread_once_t должен быть инициализирован как PTHREAD_ONCE_INIT.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top