2010-09-24 2 views
0

У меня есть просмотр потоков событий файловой системы в Mac OS X. Если я копирую 100 файлов в папку, на которую смотрят, я, очевидно, получаю несколько событий файловой системы, и, следовательно, несколько обратные вызовы. Мне интересно, обрабатываются ли эти обратные вызовы один за другим? Или каждое событие вызывает поток ОС, который, в свою очередь, вызывает функцию обратного вызова, и в этом случае у нас будет несколько потоков, каждый из которых выполняет одну и ту же функцию обратного вызова?Вопрос о множественных обратных вызовах, происходящих одновременно

ответ

1

Это зависит от того, какой механизм вы используете для просмотра событий файловой системы.

Каждый доступ к файлу генерирует уведомление внутри ядра.

Если вы используете общедоступный API FSEvents, слишком частые обновления объединяются в одно уведомление. В этом случае принимающая сторона управляется run loop, то есть обратный вызов не, вызываемый в новом фоновом потоке, или в контексте потока ОС. Он запускается в цикле событий, который вы указали, обычно в основном потоке, который запускает основной цикл обработки событий.

Если вы напрямую подключаетесь к /dev/fsevents (см., Например, the OS X book), вы получаете все события в вызывающем потоке один за другим, возможно, с несколькими событиями, возвращаемыми одним вызовом.

Аналогичным образом, если вы используете BSD-производный kqueue, вы можете получить несколько событий от вызова kqueue, если события часты.

В любом случае ОС не запускает ваш обратный вызов в новом потоке/ОС, а также магически дублирует поток, наблюдая за действиями файловой системы, чтобы они могли обрабатывать события одновременно.

Смежные вопросы