Как мне избежать вытеснения моего потока в пользовательском режиме

У меня есть простой фрагмент детерминированной работы, для завершения которой требуется всего тринадцать машинных инструкций. Поскольку первая инструкция принимает самодельный семафор (spinlock), а последняя инструкция освобождает его, я защищен от всех других потоков, работающих на других ядрах, поскольку они пытаются взять и передать тот же семафор.

Проблема возникает, когда какой-то поток прерывает поток, удерживающий семафор, до того, как он сможет завершить свою «критическую секцию». В худшем случае прерывание убивает поток, удерживая семафор, или, что может случиться, один из потоков, обычно конкурирующих за семафор, разветвляется на код, который может генерировать прерывание, вызывающее взаимоблокировку.

У меня нет возможности синхронизироваться с этими другими потоками, когда они разветвляются на те части кода, которые я не могу контролировать. Я думаю, что мне нужно отключить прерывания, как я это делал в старые дни VxWorks, когда я работал в режиме ядра. Это всегда тринадцать инструкций, и я всегда в полной безопасности, если могу выполнить все тринадцать инструкций до того, как мне придется выполнить прерывание. Да, и это все мои собственные внутренние данные, кроме самодельного семафора, нет ничего, что блокировало бы что-то еще.

Я прочитал несколько ответов, которые я считаю близкими. Большинство из них связано с вызовами Critical Section в Windows API (не той ОС, но, возможно, правильной концепции). Большинство неправильных решений предполагают, что я могу заставить все потоки-нарушители использовать мьютекс, который я создаю с помощью библиотек pthread.

Мне нужно это решение на C/C++ в Linux и Solaris.

Вопрос Джонни Крэша очень близок предотвращение прерывания потока Linux планировщиком

KermitG также Могу ли я предотвратить выполнение pthread пользовательского пространства Linux в критическом коде?

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

5
задан Community 23 May 2017 в 12:29
поделиться