Пытался обрабатывать сигнал (ALSA-коллбеки есть сигналы, если я правильно понимаю), вызывая в обработчике это:
boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
Как показал дебаг, с этим кодом изредка случается задержка. В результате ALSA не дожидается обработки сигнала и посылает ещё один сигнал. А внутри приведённой функции есть блокировка примитива синхронизации ядра. Правила обработки сигналов подразумевают начало выполнения нового обработчика без ожидания завершения старого. В результате имеем блокировку где-то в ядре навечно.
В общем, придётся отказаться от общения с часами, или заменить на какое-то другое. Вопрос о том, должен ли приведённый код выполняться долго и на что его лучше заменить?
Может я неправильно понял ситуацию и происходит не «долгое выполнение» этого кода, а просто сразу вечная блокировка почему-то.
Эта же функция выполняется из другого потока, но это всё-таки отдельный поток - его выполнение сигналом блокироваться не должно и блокировку он должен освободить рано или поздно.