Немного сборки
После прочтения этой статьи о блокировки свободных буферов и, увидев использования CAS (сравнить и своп), я чувствовал, что размещение сборки кода, чтобы сделать то же самое. Используйте случае там было написать собственный метод и вызывать его из Java (еще в 1.5, когда одновременно структур данных в Java были более или менее несуществующие). Не мудрствуя лукаво, я раскрыть код на вас
. Во-первых, для СПС и второй для вычисления НОД по алгоритму Евклида (это могут быть найдены во многих местах и учебных пособий, а).
Скомпилируйте и запустите инструкцию gcc file_name.c ; ./a.out
Сравните и Обмен
# Include# Include / / Обмен - NewValue, comperand старое / ожидаемое значение / * * Функция фактически выполняет следующие вещи - если значение в * DEST равно OldValue затем заменить его NewValue еще оставить его без изменений: не все эти атомарно * * Есть два варианта возврата * 1.is начальное значение * DEST и оставить бремя вызова FXN сравнить его с oldval * 2. сделать это здесь и вернуть 0 или 1, то это должно быть более эффективным ** / / * Позже изменить его в макросов * / Int CAS (Int * НАЗНАЧЕНИЕ, OldValue Int, Int NewValue) { Е ("(% D,% D,% г)", * НАЗНАЧЕНИЕ, OldValue, NewValue); / * Int CAS (INT DEST, Int OldValue, Int NewValue) {* / / * Int CAS (INT DEST, Int NewValue, Int OldValue) {* / Int результат = 1 ;/ * 1 показывает, что CAS успешно и 0 показывает, что он не * / / * Кстати нужно установить флаг см для затирания! * / volatile__ __asm__ __ ( "Movl% 2,%% EAX \ п \ т" "Movl% 3,%% EBX \ п \ т" "Movl 0%,%% ECX \ п \ т" "LOCK \ п \ т" "CMPXCHG%% EBX, (%% ECX) \ п \ т" / * должны быть блокировки на одной строке * / "Совершено JZ \ п \ т" "Movl $ 0,% 1 \ п \ т" "Совершено: \ п \ т" : "= М" (Dest), "= г" (результат) "Г" (OldValue), "г" (NewValue), «м» (Dest) : "% EAX", "% EBX", "ECX", "CC" ); Е ("(% D,% D,% г)", * НАЗНАЧЕНИЕ, OldValue, NewValue); возвращение результата; } / * TODO * Написать еще АНМ FXN которая ставит выше FXN в то время цикла и продолжать пробовать, если он успешно * / Int основных () { Int = 5, б = 6; Int * с = (INT *) таНос (SizeOf (INT)); * С = 6; / * Int C = 6, * / Е ("% г \ п", CAS (C, B, б)); Е ("% г \ п", CAS (C, B)); Е ("% г \ п", CAS (С, А,)); Е ("% г \ п", CAS (C, B, б)); * С = 6; / * С = 5, * / Е ("изменение значения с * к% г \ п", * с); Е ("% г \ п", CAS (C, B, б)); Е ("% г \ п", CAS (C, B)); Е ("% г \ п", CAS (С, А,)); Е ("% г \ п", CAS (с, а, б)); Е ("% г \ п", CAS (C, B)); return 0; }
Форматирование ноты - кажется WP подсветку синтаксиса добавления В конце концов, игнорировать это.
НОД
# IncludeInt НОД (INT A, INT B) { 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, первое, второе; Е ("Введите два целых числа:"); Scanf ("% D% D", и первое, и второе); Е ("НОД% D и% D% г \ п", первый, второй, НОД (первый, второй)); return 0; }



































