Вопрос о множественных обратных вызовах, происходящих одновременно - PullRequest
0 голосов
/ 24 сентября 2010

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

1 Ответ

1 голос
/ 25 сентября 2010

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

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

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

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

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

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

...