Trochu sestavy
Po přečtení tohoto článku o vyrovnávací paměti zámku zdarma a vidí využití CAS (porovnat a swap), připadal jsem si jako vysílání kód shromáždění, aby učinily totéž. Use case tam bylo napsat nativní metody a volat z Java (1,5 v roce, kdy souběžné datové struktury v jazyce Java byly více či méně neexistuje). Bez dalších okolků, budu uvolnit kód na vás
. Prvním z nich je pro CAS, a druhý je pro práci na počítači pomocí GCD Euclid algoritmus (ten lze nalézt na mnoha místech a návody, jak dobře).
Sestavit a spustit pokyny gcc file_name.c ; ./a.out
Porovnejte a Swap
# Include# Include / / Výměna - newValue, comperand je stará / očekávaná hodnota / * * Funkce vlastně dělá následující věc - pokud hodnota * dest se rovná oldvalue pak jej nahradit jiným newValue ponechat beze změny: všechny tyto atomicky * * Existují dvě možnosti pro návratové hodnoty * 1.is výchozí hodnota * dest a ponechat břemeno volání fxn porovnat ji s oldval * 2. to sem a return 0 nebo 1, mělo by to být efektivnější * * / / * Později změnit na makro * / int cas (int * dest, int oldvalue, newValue int) { printf ("(% d,% d,% d)", * dest, oldvalue, newValue); / * Int CAS (int dest, int oldvalue, newValue int) {* / / * Int CAS (int dest, int newValue, oldvalue int) {* / int result = 1, / * 1 ukazuje, že CAS podařilo a 0 ukazuje, že selhala * / / * Btw třeba nastavit cc pro vlajku praštit! * / __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 měl být na stejném řádku * / "JZ Hotovo \ n \ t" "Movl $ 0,% 1 \ n \ t" "Hotovo: \ n \ t" : "= M" (dest), "= g" (výsledek) : "G" (oldvalue), "G" (newValue), "m" (dest) : "% Eax", "% ebx", "ecx", "CC" ); printf ("(% d,% d,% d)", * dest, oldvalue, newValue); return vysledek; } / * TODO * Napsat další asm fxn který klade vyšší fxn v cyklu while a dál snažit, pokud uspěje * / int main () { int a = 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, a)); printf ("% d \ n", CAS (c, a, a)); printf ("% d \ n", CAS (c, b, b)); * C = 6; / * C = 5; * / printf ("Změna hodnoty * C% d \ n", * c); printf ("% d \ n", CAS (c, b, b)); printf ("% d \ n", CAS (c, b, a)); printf ("% d \ n", CAS (c, a, a)); printf ("% d \ n", CAS (c, a, b)); printf ("% d \ n", CAS (c, b, a)); return 0; }
Formátování poznámky - vypadá jako zvýrazňovač syntaxe WP přidává Na konci ignorovat.
GCD
# Includeint gcd (int a, int b) { int výsledku; / * Počítat největší společný dělitel pomocí Euclid algoritmus * / __asm__ __volatile__ ("movl% 1,%% eax;" "Movl% 2,%% ebx;" "CONTD: cMpl $ 0,%% ebx;" "Je provedeno;" "Xorl%% edx,%% edx," "Idivl%% ebx;" "Movl%% ebx,%% eax;" "Movl%% edx,%% ebx;" "Jmp CONTD;" "Hotovo: movl%% eax,%, 0,": "= g" (výsledek): "g" (a), "G" (b) ); return vysledek; } int main () { int první, druhý, printf ("Zadejte dvě celá čísla:"); scanf ("% d% d", a první, druhý a); printf ("% d GCD &% d je% d \ n", první, druhý, gcd (první, druhý)); return 0; }



































