У меня есть простой кусок детерминированной работы, для выполнения которой требуется только тринадцать машинных инструкций. Поскольку первая инструкция принимает самодельный семафор (spinlock), а последняя команда освобождает его, я уверен в безопасности от всех других потоков, работающих на других ядрах, когда они пытаются взять и дать тот же семафор.Как я могу избежать превенции моего потока в пользовательском режиме
Проблема возникает, когда какой-либо поток прерывает поток, содержащий семафор, прежде чем он сможет завершить свой «критический раздел». В худшем случае прерывание убивает поток, удерживая семафор, или, как может случиться, один из потоков, обычно конкурирующих за ветви семафора, выдает код, который может генерировать прерывание, вызывающее тупик.
У меня нет возможности синхронизации с этими другими потоками, когда они вступают в те части кода, которые я не могу контролировать. Я думаю, что мне нужно отключить прерывания, как я делал в своих старых VxWorks днях, когда я работал в режиме ядра. Его всегда тринадцать инструкций, и я всегда полностью в безопасности, если я смогу выполнить все тринадцать инструкций, прежде чем я должен выполнить прерыв. О, и это все мои собственные внутренние данные, другие, что в домашнем семафоре нет ничего, что блокирует что-то еще.
Я прочитал несколько ответов, которые, как я думаю, близки. Большинство из них связано с вызовами критической секции в Windows API (неправильная ОС, но, возможно, правильная концепция). Большинство неправильных решений предполагают, что я могу заставить все оскорбительные потоки использовать мьютекс, который я создаю с помощью библиотек pthread.
Мне нужно это решение в C/C++ для Linux и Solaris. Вопрос
сбоев Джонни очень близка prevent linux thread from being interrupted by scheduler
KermitG также Can I prevent a Linux user space pthread yielding in critical code?
Спасибо за ваше внимание.
Используйте мьютексы из вашей библиотеки потоков (pthread) и внимательно прочитайте документацию. Не используйте свои собственные примитивы синхронизации. Параллельное программирование сложно :) –
@ RafałRawicki: «Не делай ничего, потому что это сложно». Возможно, ему просто нужно, потому что мьютексы - это дерьмо. – Cartesius00
Возможный дубликат [предотвращение прерывания потока linux от планировщика] (http://stackoverflow.com/questions/2595735/prevent-linux-thread-from-being-interrupted-by-scheduler) –