Trochu montáže
Po prečítaní tohto článku o nárazníky Lock Free a videl využitie CAS (porovnanie a výmena), pripadal som si ako vysielanie kód assembleri, aby urobili to isté. Use case tam bolo napísať natívne metódy a volať z Java späť do 1.5, kedy súbežné dátové štruktúry v Jave boli viac či menej neexistuje). Bez ďalších okolkov, ja sa uvoľnil kód na vás
. Prvým z nich je pre CAS a druhý je pre výpočtovú GCD pomocou Euclid algoritmus (ten možno nájsť na mnohých miestach a cvičenie i).
Kompilovať a spúšťať inštrukcie gcc file_name.c ; ./a.out
Porovnajte a Swap
# Include# Include / / Výmena - newValue, comperand je starý / očakávaná hodnota / * * Funkcia vlastne robí nasledujúce vec - ak je hodnota na * dest sa rovná oldvalue potom ho nahradiť iným newValue ponechať bezo zmeny: to všetko atomárny * * Existujú dve možnosti pre návratové hodnoty * 1.is počiatočná hodnota z * dest a nechať záťaže volajúceho FXN porovnať ju s oldval * 2. to sem a vráti 0 alebo 1, malo by to byť efektívnejšie ** / / * Neskôr zmeniť v makre * / int cas (int * dest, int oldvalue, int newValue) { printf ("(% d,% d,% d)", * dest, oldvalue, newValue); / * Int CAS (int dest, int oldvalue, int newValue) {* / / * Int CAS (int dest, int newValue, int oldvalue) {* / int result = 1 ;/ * 1 ukazuje, že sa podarilo cas a 0 ukazuje, že sa nepodarilo * / / * Btw treba nastaviť cc pre vlajky prepisovanie! * / __asm__ __ volatile__ ( "Movl% 2,%% EAX \ n \ t" "Movl% 3,%% EBX \ n \ t" "Movl% 0,%% ECx \ n \ t" "LOCK \ n \ t" "CMPXCHG%% EBX, (%% ECx) \ n \ t" / * LOCK by mal byť na rovnakom riadku * / "JZ Dané \ n \ t" "Movl $ 0,% 1 \ n \ t" "Dané: \ n \ t" : "= M" (dest), "= g" (výsledok) : "G" (oldvalue), "G" (newValue), "m" (dest) : "% EAX", "% EBX", "ECx", "cc" ); printf ("(% d,% d,% d)", * dest, oldvalue, newValue); return vysledok; } / * TODO * Napísať ďalšie asm FXN ktorý sa prejavuje predovšetkým FXN v cykle while a ďalej snažiť, ak uspeje * / int main () { int = 5, b = 6; int * c = (int *) malloc (sizeof (int)); * C = 6; / * Int c = 6; * / printf ("% d \ n", CAS (c, b, b)); printf ("% d \ n", CAS (c, b,)); printf ("% d \ n", CAS (c,,)); printf ("% d \ n", CAS (c, b, b)); * C = 6; / * C = 5; * / printf ("meniace sa hodnota * c k% d \ n", * c); printf ("% d \ n", CAS (c, b, b)); printf ("% d \ n", CAS (c, b,)); printf ("% d \ n", CAS (c,,)); printf ("% d \ n", CAS (c, a, b)); printf ("% d \ n", CAS (c, b,)); return 0; }
Formátovanie poznámky - sa zdá byť ako zvýrazňovač syntaxe wp je pridanie nakoniec ignorovať.
GCD
# Includeint GCD (int, int b) { int vysledok; / * Počítať najväčší spoločný deliteľ pomocou Euclid algoritmus * / __asm__ __ volatile__ ("movl% 1,%% EAX;" "Movl% 2,%% EBX;" "CONTD: cMpl $ 0,%% EBX;" "Je vykonané;" "Xorl%% EDX,%% EDX;" "Idivl%% EBX;" "Movl%% EBX,%% EAX;" "Movl%% EDX,%% EBX;" "JMP CONTD;" "Dané: movl%% EAX,% 0;": "= g" (výsledok): "g" (), "G" (b) ); return vysledok; } int main () { int prvý, druhý, printf ("Zadajte dve celé čísla:"); scanf ("% d% d", a prvý a druhý); printf ("% d GCD zo &% d je% d \ n", prvá, druhá, GCD (prvá, druhá)); return 0; }



































