Связь потоков при получении сигнала

Я создал несколько потоков из основного потока. У всех этих потоков одна и та же процедура запуска. Эта процедура содержит счетчик, который является локальным для процедуры. Я хотел бы периодически распечатывать этот счетчик. Как мне этого добиться?

Я знаю, что мы можем использовать условные переменные для связи между разными потоками. Но я не хочу блокировать какой-либо из моих потоков и заставлять их ждать определенного сигнала, короче счетчик должен постоянно обновляться.

Подводя итог, я хочу добиться:

  1. Несколько потоков работают постоянно, обновляя свои собственные счетчики.

  2. SIGALRM зарегистрирован и периодически сообщает каждому из этих потоков напечатать свои счетчики.

Как вы планируете получить доступ к локальной переменной функции из обработчика сигнала?

n. 1.8e9-where's-my-share m. 13.04.2018 08:48

Я действительно не понимаю, почему локальная переменная потока вызывает беспокойство из-за многопоточности? Может быть, если вы дадите нам MCVE (stackoverflow.com/help/mcve), будет легче понять

Kami Kaze 13.04.2018 08:51

Да. Вот чего я не понимаю. Я предполагаю, что обработчик сигнала должен передать этой функции какое-то сообщение.

Rohit Walavalkar 13.04.2018 08:52

Добавьте в подпрограмму аргумент, который сообщает ей, что нужно просто распечатать счетчик, если этот аргумент присутствует. Из обработчика сигналов вызовите процедуру с этим аргументом, чтобы распечатать локальный счетчик. Я не думаю, что здесь есть какие-либо опасения по поводу многопоточности или состояния гонки.

Siddu 13.04.2018 09:16

программа запуска уже запущена. Как я могу снова вызвать подпрограмму из обработчика сигнала. Даже если бы я это сделал, это будет в другом контексте потока.

Rohit Walavalkar 13.04.2018 09:29

Обработчики сигналов могут обращаться только к глобальным / статическим данным, поэтому вам нужно назначить глобальную переменную (типа sig_atomic_t) в обработчике и проверить ее в рабочей подпрограмме.

n. 1.8e9-where's-my-share m. 13.04.2018 10:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
106
1

Ответы 1

просто используйте глобальную переменную в качестве счетчика для SIGALRM, который обновляется в обработчике, а затем в подпрограмме проверьте, изменилось ли значение глобального счетчика, распечатайте локальный счетчик и сохраните значение глобального счетчика в локальной переменной

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