2015-10-20 1 views
0

Я читал принципы операционной системы Абрахимом, Галвином. В процессе синхронизации темы, следующее определение даются для функции TestAndSet, которая впоследствии используется для обеспечения взаимного исключения:Процесс Синхронизация-TestAndSetLock

boolean TestAndSet(boolean *target) { 
boolean rv = *target; 
*target = TRUE; 
return rv; 
} 

Он упоминается в книге, что эта инструкция является специальной инструкцией аппаратной и выполняются атомарно. Мой вопрос: как это реализовать в C? Должен ли я предоставить его определение так же, как и для других пользовательских функций, или мне нужно импортировать некоторую библиотеку, которая уже реализует это? Если случай является прежним, и я сам определяю функцию, какова гарантия того, что она будет выполнена атомарно?

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

Пожалуйста, помогите. У меня много трудностей в понимании текста этой книги.

+0

Такая функциональность предоставляется ABI и ОС, а не напрямую. C. Перед тем, как приблизиться к инструкциям intercore-lock, доступным на вашем процессоре, проверьте свой API. –

+0

http://stackoverflow.com/questions/2287451/how-to-perform-atomic-operations-on-linux-that-work-on-x86-arm-gcc-and-icc – kaylum

ответ

0

В книге упоминается, что эта инструкция является специальной аппаратной инструкцией и выполняется атомарно. Мой вопрос: как реализовать это в C?

В книге представлена ​​функция C, которую вы представили, которая предназначена для объяснения поведения. Он уже делает все, кроме как без гарантии атомарности.

C2011 обеспечивает в основном то, что вы описали, предварительно построенный, в форме atomic_flag_test_and_set(). Если вы можете считать C2011 своим языком реализации, вы можете использовать его.

Более ранние версии стандарта C не обеспечивают то, что вам нужно для реализации такой функции, однако, даже если C2011 не предоставляет механизмов для реализации ваших собственных атомных операций, не полагаясь на встроенные атомные типы C и функций.

Должен ли я указать его определение, как и для других пользовательских функций, или мне нужно импортировать некоторую библиотеку, которая уже реализует это?

Представленный код представляется скорее объяснительным, чем функциональным. Атомный тестовый набор ведет себя так, как если бы эта функция могла функционировать атомарно.

Если случай прежний, и я сам определяю функцию, какова гарантия, что она будет выполнена атомарно?

Существует нет.

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

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

+0

Спасибо. Однако я не могу найти какой-либо код, реализующий атомный тестовый набор. Не могли бы вы мне помочь. – shiva

+0

@shiva, я не могу помочь вам дальше, чем мой ответ уже есть. Если вы не получите от него ничего другого, по крайней мере, получите, что нет способа перевернуть ваш собственный атомный тест и установить в C. Вам нужно будет реализовать его в сборке, хотя вы можете * обернуть * процедуру сборки в C функция \. –

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