Написание атомарной функции - PullRequest
4 голосов
/ 14 июля 2010

Я хочу реализовать элементарную функцию на языке Си, чтобы процесс или поток не были выгружены при выполнении функции.

Ответы [ 2 ]

3 голосов
/ 14 июля 2010

Если вы находитесь в ядре и вам действительно нужно отключить приоритет (вероятно, не очень хорошая идея, надеюсь, вы знаете, что делаете), вы можете использовать preempt_disable() и preempt_enable()(подробности смотрите в Documentation / preempt-lock.txt).

Если вы находитесь за пределами ядра, ваши возможности очень ограничены.Большинство многопроцессорных или многопоточных приложений создают мьютексы, которые они используют для самоограничения доступа к общим ресурсам.(Вспомните типичные блокировки чтения-записи.) Но это ни в коем случае не атомарно по отношению ко всем остальным процессам в системе.Он просто атомарен по отношению к другим процессам, следующим по тому же протоколу.

(И учитывая, что даже в супердорогих ноутбуках в наши дни одновременно работают несколько процессорных ядер, ваша цель - предотвратить запуск других процессов во время работы критической секциивыполняется обречено на неудачу.)

Вы могли бы предоставить вашему приложению приоритет планирования в реальном времени, но это требует очень тщательного программирования, так как программы с более низким приоритетом(например, X или ssh или bash или ..) не будет работать, если только вы не выдадите процессор или не выполните блокировку ввода-вывода.Подробнее см. sched_setscheduler(2).

2 голосов
/ 14 июля 2010

Вы путаете две вещи:

  • «Атомная» означает, что операция либо не выполнена, либо завершена полностью.
  • «Вытеснение» (свободно) означаетчто другие потоки могут работать на вашем ядре без вашего ведома.

Даже в неперегрузочной ОС (например, в классической Mac OS) все еще не гарантируется атомарность:

  • Прерывания могут происходить в любое время (если только вы не отключаете прерывания тоже).
  • Код на других ядрах будет работать, даже если вы отключите прерывания.

Это также помогает узнать почему вы думаете, что вам нужны атомарные операции.Самый простой способ защитить общую структуру данных - это использовать блокировку.Если вы находитесь в ядре, прочитайте Ненадежное руководство по блокировке от Расти Рассела (оно может быть немного устаревшим).Если вы находитесь в пространстве пользователя, просто используйте мьютекс pthread.

...