Безопасно ли вызывать CFRunLoopStop из другого потока? - PullRequest
6 голосов
/ 01 сентября 2009

Сборка моего приложения Mac (в основном POSIX) порождает дочерний поток, который вызывает CFRunLoopRun () для выполнения цикла событий (для получения событий изменения конфигурации сети из MacOS).

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

Кажется, это работает, но мой вопрос: это безопасный / рекомендуемый способ сделать это? В частности, может ли вызов CFRunLoopStop () из другого потока вызвать состояние гонки? Насколько я могу судить, в документации Apple по этому вопросу ничего не сказано.

Если вызов CFRunLoopStop () из основного потока не является решением, что является хорошим решением? Я знаю, что мог бы заставить дочерний поток вызывать CFRunLoopRunInMode () и периодически просыпаться, чтобы проверить логическое значение или что-то в этом роде, но я бы предпочел, чтобы дочерний поток не проводил опросы, если я могу избежать этого.

Ответы [ 2 ]

12 голосов
/ 22 сентября 2010

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

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

3 голосов
/ 02 сентября 2009

В частности, вызывает ли CFRunLoopStop () из другого потока [safe]?

Вот что Run Loop Management говорит:

Функции в Core Foundation обычно поточнобезопасны и могут вызываться из любого потока.

Так что, возможно, CFRunLoopStop безопасен. Но я беспокоюсь об использовании ими слова «в целом». Мое правило: если Apple не говорит, что это безопасно, вы должны предположить, что это не так.

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

...