Вопрос о нескольких обратных вызовах, происходящих одновременно

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


person Paul    schedule 24.09.2010    source источник


Ответы (1)


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

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

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

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

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

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

person Yuji    schedule 24.09.2010