Сделать поток непрерывным mac os

Я разрабатываю многопоточное приложение для Mac OS. Я столкнулся со следующей проблемой: когда я пытаюсь выполнить отладку с помощью приложения xcode-cocoa (ПРИМЕЧАНИЕ: консольное приложение не имеет такой же проблемы), мои потоки возвращаются с ошибками при следующих вызовах: kevent(), semaphore_wait() , semaphore_timedwait() с EINTR (для kevent) и KERN_ABORTED (для semaphore_*). Я думаю, это связано с работой lldb.

Проблема в том, что я не могу отлаживать свое приложение, так как получаю такие события. Если я сделаю их обработку (просто вызову ту же функцию), то мое приложение будет работать очень странно. Во всяком случае, я не могу (я могу, но это очень некрасиво) сделать хорошую обработку для такой ситуации, когда мой semaphore_timedwait() прерывает, поскольку я должен «запоминать» время до того, как я пошел timedwait(), чтобы сделать новый timedwait() правильным.

Итак, решение моих проблем было бы, если бы я мог отключить для текущего потока «прерывание» - возможность быть прерванным из другого потока\процесса, что мои функции не будут возвращаться, если lldb отправит какой-то сигнал. Возможно ли это на mac os?


person user1266334    schedule 01.06.2012    source источник


Ответы (1)


Несколько заметок:

  1. В некоторых отладчиках (я знаю, что gdb поддерживает это) вы можете сказать, все ли потоки или только один остановлены в точке останова.

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

  3. В многопоточном приложении вы можете рассмотреть возможность блокировки сигналов в большинстве (вспомогательных) потоков, поэтому сигналы должны обрабатываться в потоке, который готов к этому. См. pthread_sigmask().

person mity    schedule 01.06.2012