有点集会

2009年8月29日, prashant
提起下: 技术

看完这篇文章有关锁空闲缓冲区,看到使用了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;
 }

评论

    博客评论由Disqus