Хийи решений определения типа: semaphors (или мьютекса), testandset и OFC спина-блокировок обеспечивает защиту критического кода: это либо garunteeing атомной операции (средство блокировки для например, потребуется всего одна операция, чтобы завершить и реализовать блокировку, протоколы, такие как протокол пекарни, и отключить попытку процесса (и это то, что вы хотите); - заблокирован никто другой, не может войти в этот критический код (допустим, вы использовали разделяемую память или что-то в этом роде), поэтому даже если есть переключатель контекста и два потока вместе, мы обещаем, что только один может получить доступ к этому коду, предполагается, что все потоки, которые используют эту память или w/e, имеют критический регион имеет одинаковые тип замка aquire
для получения дополнительной информации о спин-блокировки (которая отключить peeamption ЦП) относятся к этому: http://www.linuxinternals.org/blog/2014/05/07/spinlock-implementation-in-linux-kernel/ обратите внимание, что блокировка делает «занят ожидание» - значит, пока preeamption включен, и вы не aquire Закрепить процессор «Истощение» время расчета на работу в бесполезной цикле
вы можете также использовать IRQ \ выгрузить команды напрямую, но это довольно опасно например:
preempt_enable() decrement the preempt counter
preempt_disable() increment the preempt counter
preempt_enable_no_resched() decrement, but do not immediately preempt
preempt_check_resched() if needed, reschedule
preempt_count() return the preempt counter
, так как я не знаю, что вы пытаетесь достичь этого k inda трудно идти конкретным и отвечать на ваши потребности, но я действительно копаю сонные семафоры: http://www.makelinux.net/books/lkd2/ch09lev1sec4 В отличие от остального решения, которое я предложил, они не будут делать ожидание, что экономит время вычисления.
Я действительно надеюсь, что я помог в этом ... gl!
Я не знаю о Linux конкретно, но, как правило, для большинства операционных систем существует флаг «отправки», который устанавливается, если обработчик прерываний устанавливает готовый поток более высокого, чем текущий приоритет. В этом случае обработчик прерываний выходит из диспетчера (для контекстного переключателя) вместо того, чтобы просто возвращаться. Чтобы иметь дело с вложенными прерываниями, существует также флаг, используемый для отслеживания того, какое прерывание было начальным прерыванием, так что только начальное прерывание по желанию выходит через диспетчер (только вложенные будут возвращаться). – rcgldr
Важно помнить, что обработчик прерывания не может спать; он не имеет контекста задачи. Поэтому, если вам нужно синхронизировать ресурс с обработчиком прерываний, вы не можете использовать мьютекс или семафор (они могут спать); это должна быть спин-блокировка или эквивалент. Это, конечно, подразумевает, что вы не должны долго удерживать блокировку (и вы не можете ничего делать в контексте задачи, который может блокироваться, удерживая ее). –
Ну, вы можете, конечно, отправить единицы в семафор. –