Я хочу реализовать атомную функцию на языке C, чтобы процесс или поток не были вытеснены во время выполнения функции.Написание атомной функции
ответ
Если вы в ядре, и вы действительно нужно отключить упреждения (вероятно, не отличная идея, я надеюсь, вы знаете, что вы делаете), вы можете использовать preempt_disable()
и preempt_enable()
(см Documentation/выгружать-замок .txt).
Если вы находитесь вне ядра, ваши варианты очень ограничены. Что делают большинство многопроцессорных или многопоточных приложений, это создавать мьютексы, которые они используют для самоограничения при доступе к общим ресурсам. (Подумайте, типичные блокировки чтения-записи.) Но это никоим образом не является атомарным по отношению ко всем другим процессам в системе. Он просто атомарен по отношению к другим процессам по тому же протоколу.
(И учитывая, что даже супер-дешевые ноутбуки в эти дни имеют несколько ядер работают CPU одновременно, ваша цель предотвращения других процессов работы в то время как ваша критическая секция работает обречена на провал.)
Вам мог предоставите вашему приложению приоритет планирования в режиме реального времени, но для этого требуется очень тщательное программирование, поскольку программы с более низким приоритетом (такие как X или ssh или bash или ..) не будут выполняться, если вы не получили, чтобы получить процессор или выполнить блокировку IO. См. sched_setscheduler(2)
.
Как работает семафор и блокировка? – Pointer
@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
Ты путаешь две вещи:
- «Atomic» означает операцию либо по-видимому, не работать или быть полностью завершена.
- «Предотвращение» (свободно) означает, что другие потоки могут работать на вашем ядре без вашего уступки.
Даже на невытесняющей ОС (например, классический Mac OS), все еще не гарантировано атомарным
- Прерывания может произойти в любое время (если не отключить прерывания тоже).
- Код на других ядрах будет работать, даже если вы отключите прерывания.
Это также помогает знать почему Вы считаете, что вам нужны атомные операции. Самый простой способ защитить общую структуру данных - использовать блокировку. Если вы в ядре, прочитайте Rusty Russell's Unreliable Guide to Locking (это может быть немного устаревшим). Если вы находитесь в пользовательском пространстве, просто используйте мьютекс pthread.
спасибо, я буду использовать блокировку – Pointer
- 1. Назначение возвращаемого значения атомной функции
- 2. Написание основной функции 0
- 3. Написание чистой функции sql
- 4. Написание собственной функции JQuery?
- 5. Написание функции обратного вызова
- 6. Написание функции из определений?
- 7. Написание префиксной функции Haskell
- 8. C# Написание функции
- 9. написание функции XQuery
- 10. Написание функции переупорядочения
- 11. Написание функции стандартного отклонения
- 12. Написание динамической функции SQL
- 13. Написание функции в php
- 14. Javascript атомной серии операций
- 15. написание функции ключа внутри отсортированного функции
- 16. Написание функции для каррирования любой функции
- 17. Использование атомной функции CUDA с энергозависимой общей памятью
- 18. Рельсы: Написание функции для div
- 19. Написание функции проверки электронной почты
- 20. написание средней функции в Haskell
- 21. Написание функции для завершения программы?
- 22. Написание PHP внутри функции Javascript
- 23. Написание более эффективной функции часов
- 24. Написание плагина для функции jquery?
- 25. Написание новой функции для excel
- 26. Trouble написание функции кубического корня
- 27. написание конкретных jQuery jQuery функции
- 28. Написание простой функции с ggplot2
- 29. Написание функции JQuery более эффективно
- 30. Написание функции «Печать» в Python
Является ли это * в * ядре Linux или в пользовательском пространстве? – Artelius
Возможно ли это в пользовательском пространстве? , а если нет, то как это можно сделать в пространстве ядра. – Pointer
Это, вообще говоря, невозможно в упреждающей многозадачной ОС. Могут быть странные крючки, которые позволяют вам это делать, но более важно решить вопрос: почему вы пытаетесь это сделать в первую очередь? –