Стоит задача обработки разделяемых данных в обработчике прерывания (обращение к данным занимает около десяти инструкций). Существует ли быстрый способ блокировки остальных процессоров на время этой обработки? Что-то типа LOCK на несколько инструкций?
это обычно делается с помощью семафора, владение которым получают, используя инструкции с LOCK. Устраивается гонка до семафора, кто выиграл -- выполняет критичный участок, остальные ждут освобождения семафора. Для захвата семафора весьма подходит lock cmpxchg.
Это-то понятно. Проблема немного в другом. Есть чужое приложение, которое обрабатывает данные по прерыванию и еще где-то по ходу выполнения программы. Данные организованы в виде двусвязного списка. Прерывание происходит несколько раз в секунду. Мне требуется по сигналу прерывания выбирать узлы списка и передавать на обработку. Соответственно, вешаю свой обработчик прерывания и правлю в нем этот список. На 1-процессорной машине вопросов нет. На многопроцессорной же возможна ситуация, когда узел из списка будет удален только наполовину, а на другом процессоре приложение к нему обратится. Существует вариант разослать DPC всем остальным процессорам. Но боюсь, что из-за этого капитально просядет производительность. Существуют ли в таком случае какие-нибудь варианты решения?
Тут либо дописать кусок кода для синхронизации к 'чужой' проге, либо в 'своей' части глушить все остальные процессоры при обработке прерывания (что весьма отстойно). Или вариации -- например, на время добавления/удаления узла притормаживать поток(и) 'чужого' приложения.
В общем быстрого и правильного решения по-любому нет. (Быстро) ^ (надежно) Ситуация с необходимостью блокировки остальных процессоров вообще достаточно частая вещь. Почему интересно разработчики процессоров не предусмотрели такой штуки? Имхо, было бы весьма полезно