Немного сборки
После прочтения этой статьи о блокировки свободных буферов и, видя, использование ССС (сравните и своп), я чувствовал, что размещение сборки кода, чтобы сделать то же самое. Используйте случае там было написать собственный метод и вызывать его из Java (еще в 1.5, при одновременных структур данных в Java были более или менее несуществующие). Не мудрствуя лукаво, я раскрыть код на вас
. Первая предназначена для КАС и второй для вычисления НОД по алгоритму Евклида (это могут быть найдены во многих местах и учебных пособий, а).
Скомпилируйте и запустите инструкции gcc file_name.c ; ./a.out
Сравните и замены
# Включить# Включить / / Обмен - NewValue, comperand стар / ожидаемое значение / * * Функция на самом деле делает следующую вещь - если значение в * Dest равно OldValue затем заменить его NewValue еще оставить его без изменений: делать все это атомарно * * Есть два варианта для возвращаемого значения * 1.is начальное значение * Dest и оставить бремя вызова FXN сравнить его с oldval * 2. сделать это здесь и вернуть 0 или 1, то это должно быть более эффективным * * / / * Позже изменить его на макро * / Int CAS (Int * Dest, Int OldValue, Int NewValue) { Е ("(% D,% D,% г)", * Dest, OldValue, NewValue); / Внутр CAS (INT Dest, Int OldValue, Int NewValue) {* / / Внутр CAS (INT Dest, Int NewValue, Int OldValue) {* / Int результат = 1 / * 1 показывает, что CAS успешно и 0 показывает, что она не смогла * / / * Кстати нужно установить флаг куб.см для затирания! * / __asm__ __volatile__ ( "Movl% 2,%% EAX \ п \ т" "Movl% 3,%% EBX \ п \ т" "Movl% 0,%% ECX \ п \ т" "LOCK \ п \ т" "CMPXCHG%% EBX, (%% ECX) \ п \ т" / * должен быть ЗАМОК на той же строке * / "Совершено JZ \ п \ т" "Movl $ 0,% 1 \ п \ т" "Совершено: \ п \ т" : "= Т" (Dest), "= г" (результат) : "Г" (OldValue), "г" (NewValue), "м" (Dest) : "% EAX", "% EBX", "ECX", "сс" ); Е ("(% D,% D,% г)", * Dest, OldValue, NewValue); возвращение результата; } / * TODO * Написать еще ASM FXN которая ставит выше FXN в то время цикла и продолжать пробовать, если он успешно * / Int основных () { Int = 5, б = 6; Int * с = (INT *) таНос (SizeOf (INT)); * С = 6; / Внутр с = 6; * / Е ("% г \ п", CAS (с, б, б)); Е ("% г \ п", CAS (с, б,)); Е ("% г \ п", CAS (с,,)); Е ("% г \ п", CAS (с, б, б)); * С = 6; / * С = 5; * / Е ("изменение значения с * к% г \ п", * с); Е ("% г \ п", CAS (с, б, б)); Е ("% г \ п", CAS (с, б,)); Е ("% г \ п", CAS (с,,)); Е ("% г \ п", CAS (с, а, б)); Е ("% г \ п", CAS (с, б,)); возврат 0; }
Форматирование заметки - кажется WP подсветку синтаксиса добавляет в конце концов, игнорируйте это.
НОД
# ВключитьInt НОД (Int, Int б) { Int результат; / * Вычислить Наибольший общий делитель по алгоритму Евклида * / __asm__ __volatile__ ("movl% 1,%% EAX;" "Movl% 2,%% EBX;" "ПРОДОЛЖЕНИЕ: cmpl $ 0,%% EBX;" "Совершено е;" "Xorl%% EDX, EDX%%;" "Idivl%% EBX;" "Movl EBX%%,%% EAX;" "Movl%% EDX, EBX%%;" "JMP ПРОДОЛЖЕНИЕ;" "Совершено: movl%% EAX,% 0;": "= г" (результат): "г" (), "г" (б) ); возвращение результата; } Int основных () { Int первое, второе; Е ("Введите два целых числа:"); зсапЕ ("% d.% d.", и первый, и второй); Е ("НОД г% &% d.% d. \ п", первый, второй, НОД (первый, второй)); возврат 0; }



































