一个位的大会
阅读此有关锁空闲缓冲区的文章,看到使用了CAS(比较和交换)后,我觉得像张贴的汇编代码,做同样的。 使用的情况下,那边是写一个本地方法,并从Java调用(早在1.5中,当在Java并发数据结构或多或少不存在)。 事不宜迟,我将释放到你的代码
。 首先是CAS和第二计算GCD的使用Euclid算法(这个可以在许多地方,以及教程中找到)。
编译并运行指示 gcc file_name.c ; ./a.out
比较和交换
## / /交换 - newvalue,comperand是老/预期值 / * *功能实际上做以下的事情 - 如果* DEST的价值等于oldvalue然后由newvalue取代其他离开它不变:做所有这些原子 * *有两个返回值的选项 * 1.is初始值* DEST离开调用fxn比较与OLDVAL的负担 * 2。 在这里做,并返回0或1,这应该是更有效的 * * / / *后来改变成宏* / INT CAS(* DEST,oldvalue INT newvalue){ printf(“请(%D,%D,%d个)”,* DEST,oldvalue,newvalue); / * INT CAS(DEST INT,INT oldvalue,INT newvalue){* / / * INT CAS(DEST INT,INT newvalue,oldvalue){* / int结果= 1; CAS成功,0表示失败* / / * 1显示, / * BTW需要设置标志会破坏CC! * / __asm__ __volatile__( “MOVL%2,%%eax中\ N \ T” “MOVL%,3%EBX \ N \ T” “MOVL%0%ECX \ N \ T” “锁\ N \ T” “CMPXCHG%EBX,(%%ECX)\ N \ T”/ *应锁定在同一行* / “JZ完成\ N \ T” “MOVL $ 0,%1 \ N \ T” “:\ N \ T” :“= M”(DEST),“= G”(结果) “G”(oldvalue),“G”(newvalue),“M”(DEST) :“%eax中”,“%ebx中”,“ECX”,“CC” ); printf(“请(%D,%D,%d个)”,* DEST,oldvalue,newvalue); 返回结果; } / * TODO *写另一个ASM fxn以上fxn放在一个while循环,不断地尝试,除非它成功* / INT(){ INT A = 5,B = 6; INT * C =(INT *)malloc的(SIZEOF(INT)); * C = 6; / * INT C = 6; * / printf(“请为%d \ N”,CAS(C,B,B)); 输出(“%d个\ N”,CAS(C,B,A)); 输出(“%d个\ N”,CAS(C,A,A)); printf(“请为%d \ N”,CAS(C,B,B)); * C = 6; / * C = 5; * / printf(“请改变值* C至%d条\ n”,* C); printf(“请为%d \ N”,CAS(C,B,B)); 输出(“%d个\ N”,CAS(C,B,A)); 输出(“%d个\ N”,CAS(C,A,A)); printf(“请为%d \ N”,CAS(C,A,B)); 输出(“%d个\ N”,CAS(C,B,A)); 返回0; }
格式化笔记 - 像WP语法高亮似乎是加入 在年底,被忽略。
最大公约数
#INT GCD(INT A,INT B){ int结果; / *计算最大公约数,使用Euclid算法* / __asm__ __volatile__(“MOVL%1,%%eax中;” “MOVL%2,%%ebx中;” “CONTD:cmpl $ 0,%ebx中;” “JE; “xorl%%EDX,EDX%; “idivl%EBX; “MOVL%%EBX,EAX%; “MOVL%,%ebx中EDX; “JMP CONTD; “DONE:MOVL%EAX,0%;”:“= G”(结果):“G”(A),“G”(二) ); 返回结果; } INT(){ INT第一,第二; printf的(“请输入两个整数:”); scanf函数(“%d月%d”,&第一及第二); printf(“请%D&%d的最大公约数是%d \ N”,第一,第二,GCD(第一,第二)); 返回0; }



































