Трохи збірки
Після прочитання цієї статті про блокування вільних буферів і, побачивши використання 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; }



































