4

Я хочу реализовать атомную функцию на языке C, чтобы процесс или поток не были вытеснены во время выполнения функции.Написание атомной функции

+0

Является ли это * в * ядре Linux или в пользовательском пространстве? – Artelius

+0

Возможно ли это в пользовательском пространстве? , а если нет, то как это можно сделать в пространстве ядра. – Pointer

+2

Это, вообще говоря, невозможно в упреждающей многозадачной ОС. Могут быть странные крючки, которые позволяют вам это делать, но более важно решить вопрос: почему вы пытаетесь это сделать в первую очередь? –

ответ

3

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

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

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

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

+0

Как работает семафор и блокировка? – Pointer

+0

@Yogesh, если вы хотите знать, как использовать семафоры pthread, для этого нужно создать manpages для 'pthread_mutex_init (3)', 'pthread_mutex_lock (3)', 'pthread_mutex_unlock (3)'. Возможно, 'pthread_cond_signal (3)', если вы хотите использовать переменные условия вместо голых мьютексов, которые могут лучше соответствовать вашей проблемной области. Если вы хотите узнать, как реализовать эти примитивы для себя, я предлагаю прочитать [Unix Systems for Modern Architectures: Symmetric Multiprocessing and Caching for Kernel Programmers] (http://www.powells.com/biblio?isbn=9780201633382) – sarnold

2

Ты путаешь две вещи:

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

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

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

Это также помогает знать почему Вы считаете, что вам нужны атомные операции. Самый простой способ защитить общую структуру данных - использовать блокировку. Если вы в ядре, прочитайте Rusty Russell's Unreliable Guide to Locking (это может быть немного устаревшим). Если вы находитесь в пользовательском пространстве, просто используйте мьютекс pthread.

+0

спасибо, я буду использовать блокировку – Pointer

Смежные вопросы