2012-04-09 6 views
5

У меня есть простой кусок детерминированной работы, для выполнения которой требуется только тринадцать машинных инструкций. Поскольку первая инструкция принимает самодельный семафор (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?

Спасибо за ваше внимание.

+3

Используйте мьютексы из вашей библиотеки потоков (pthread) и внимательно прочитайте документацию. Не используйте свои собственные примитивы синхронизации. Параллельное программирование сложно :) –

+1

@ RafałRawicki: «Не делай ничего, потому что это сложно». Возможно, ему просто нужно, потому что мьютексы - это дерьмо. – Cartesius00

+0

Возможный дубликат [предотвращение прерывания потока linux от планировщика] (http://stackoverflow.com/questions/2595735/prevent-linux-thread-from-being-interrupted-by-scheduler) –

ответ

3

Вы не можете предотвратить превенцию потока пользовательского режима. Критические разделы (и все другие объекты синхронизации) предотвращают конфликты ваших потоков, однако они ни в коем случае не предотвращают их приостановку ОС.

Если другие темы филиал в то на тайм-аут, в то время как этот то может привести к тупиковой ситуации - у вас есть проблемы проектирования.

Правильный дизайн должен быть самым пессимистичным: преемственность может происходить повсюду в течение неопределенного времени.

+0

Дальнейшие исследования привели меня к встроенные атомные функции, предоставляемые компиляторами. Например, руководство GCC 4.7, раздел 6.52 обращается к атомным операциям. Я считаю, что мне нужен __atomic_thread_fence, но я не уверен, что это обеспечивает предохраняющую защиту, в которой я нуждаюсь. – wapadomo