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



































