Я создал несколько потоков из основного потока. У всех этих потоков одна и та же процедура запуска. Эта процедура содержит счетчик, который является локальным для процедуры. Я хотел бы периодически распечатывать этот счетчик. Как мне этого добиться?
Я знаю, что мы можем использовать условные переменные для связи между разными потоками. Но я не хочу блокировать какой-либо из моих потоков и заставлять их ждать определенного сигнала, короче счетчик должен постоянно обновляться.
Подводя итог, я хочу добиться:
Несколько потоков работают постоянно, обновляя свои собственные счетчики.
SIGALRM зарегистрирован и периодически сообщает каждому из этих потоков напечатать свои счетчики.
Я действительно не понимаю, почему локальная переменная потока вызывает беспокойство из-за многопоточности? Может быть, если вы дадите нам MCVE (stackoverflow.com/help/mcve), будет легче понять
Да. Вот чего я не понимаю. Я предполагаю, что обработчик сигнала должен передать этой функции какое-то сообщение.
Добавьте в подпрограмму аргумент, который сообщает ей, что нужно просто распечатать счетчик, если этот аргумент присутствует. Из обработчика сигналов вызовите процедуру с этим аргументом, чтобы распечатать локальный счетчик. Я не думаю, что здесь есть какие-либо опасения по поводу многопоточности или состояния гонки.
программа запуска уже запущена. Как я могу снова вызвать подпрограмму из обработчика сигнала. Даже если бы я это сделал, это будет в другом контексте потока.
Обработчики сигналов могут обращаться только к глобальным / статическим данным, поэтому вам нужно назначить глобальную переменную (типа sig_atomic_t) в обработчике и проверить ее в рабочей подпрограмме.





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