pthread_kill в GCD-управляемый поток

Я пытаюсь отправить сигнал определенной теме с pthread_kill, я использую pthread_from_mach_thread_np() чтобы получить ручку, а затем использовать pthread_kill отправить сигнал.

Это хорошо сработало в моем другом тестировании, но теперь я вижу, что при попытке сообщить о потоке, внутренне созданном GCD, я получаю код возврата 45 от pthread_kill,

GCD API, который породил этот поток:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ ... });

По какой причине это происходит?

-

Чтобы добавить дополнительную информацию, я не пытаюсь уничтожить потоки. pthread_kill() является стандартным API POSIX для отправки сигналов потокам. Если установлен обработчик сигнала, контекст потока переключается с помощью батута на обработчик.

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

2 ответа

Решение

pthread_kill() API специально запрещен для потоков рабочих очередей (рабочих потоков, лежащих в основе GCD) и возвращает ENOTSUP для таких тем.

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

Вы можете увидеть детали того, как это достигается в реализации.

Это очень плохая идея. У вас нет пула потоков GCD, и вы абсолютно не должны уничтожать его потоки из-под него.

Ответ на ваш вопрос: НЕ ДЕЛАЙТЕ ЭТОГО ПОД НИКАКИМИ ОБСТОЯТЕЛЬСТВАМИ.

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