一个位的大会

2009年8月29日,由prashant · 评论
提起下: 技术

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