一個位的大會

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;
 }

評論

    博客評論Disqus供電