アセンブリのビット
読んだ後は、このロックフリーのバッファについての記事をし、(比較とスワップ)CASの使用を見て、私は同じことをアセンブリコードをポストするように感じた。 ネイティブメソッドを記述し、(戻ってJavaの並行データ構造が多かれ少なかれ非存在だった1.5で)Javaからそれを呼び出すことがあった以上のケースを使用してください。 さらに騒ぎがなければ、私はあなたの上にコードを放つだろう
。 最初は、CASと第二は、コンピューティングGCDのためにユークリッドのアルゴリズム(これは同様に多くの場所とチュートリアルで見つけることができます)を使用しているためです。
指示コンパイルして実行します gcc file_name.c ; ./a.out
比較するとスワップ
#含まれています#含まれています / /交換 - newValueは、comperandが期待される/古い値です。 / * *関数は、実際には次のことを行います - * destに値がそれを変更しないまま、他newValueにすることで交換してのOldValueに等しい場合:しないすべてのこれらのアトミック * *戻り値用の2つのオプションがあります。 * destの* 1.is初期値とoldvalと比較するfxnを呼び出すの負担を残す * 2。 ここにそれを上に行うと0または1を返す、これはより効率的にする必要があります * * / / *後は、マクロにそれを変更する* / int型CAS(int型* destが、int型のOldValue、int型newValueは){ のprintf("(%dは、%dは、%d個)"、* destに、OldValueプロパティ、newValueは); / * int型CAS(int型をdest、int型のOldValue、int型newValueは){* / / * int型CAS(int型をdest、int型newValueは、int型のOldValue){* / int型の結果= 1; / * 1に示すようにそのCAは、それは* /を失敗したことを成功と0番組 / *ところでは、フラグが追い払ってくれるためにCCを設定する必要があります! * / __asm__の__volatile__( "MOVL%2、%%eaxに\ nを\ t"と "MOVL%3、%%ebxに\ nを\ t"と "MOVL%0、%%ECX \ nを\ t"と "LOCK \ nを\ t"と "%%をCMPXCHG EBX、(%%ECX)\ nを\ t"は/ *同じ行にあるをロックする必要があります* / "JZ、DONE \ nを\ t"と "MOVL $ 0、%1 \ nを\ t"と "DONE:\ nを\ t"は :"= M"(destが)、"= G"(結果) :"G"(のOldValue)、"G"(newValueは)、"M"(destが) :"%eaxに"、"%のEBX"、"ECX"、"CC" ); のprintf("(%dは、%dは、%d個)"、* destに、OldValueプロパティ、newValueは); 結果を返す。 } / * TODO * whileループでfxn上に置く別のASM fxnを書いて、それは* /を成功しない限り、努力を続ける int型のmain(){ します。int a = 5、B = 6; int型* C =(INT *)はmalloc(sizeof(int))を。 * C = 6; / * int型C = 6; * / のprintf("%d個\ nを"、CAS(C、B、B)); のprintf("%d個\ nを"、CAS(C、B、A)); のprintf("%d個\ nを"、CAS(C、A、)); のprintf("%d個\ nを"、CAS(C、B、B)); * C = 6; / * C = 5; * / のprintf("*の値を変更するC%dまで\ nを"、* C); のprintf("%d個\ nを"、CAS(C、B、B)); のprintf("%d個\ nを"、CAS(C、B、A)); のprintf("%d個\ nを"、CAS(C、A、)); のprintf("%d個\ nを"、CAS(C、A、B)); のprintf("%d個\ nを"、CAS(C、B、A)); 0を返します。 }
書式の注意事項 - WPのシンタックスハイライトが追加されているように思える 最後に、それを無視する。
GCD
#含まれていますint型GCD(int型A、int型B){ int型の結果; / *ユークリッドのアルゴリズムを用いて最大公約数を計算* / __asm__の__volatile__("MOVL%1、%%eaxに;" "MOVL%2、%%EBX;" "CONTD:CMPL $ 0、%%のEBX;" "JEは、DONE;" "xorl%%EDX、%%EDX;" "idivl%%EBX;" "MOVL%%ebxには、%%eaxに;" "MOVL%%EDX、%%のEBX;" "JMPはCONTD。" "DONE:MOVL%%eaxに、%0;":"= G"(結果):"G"()、"G"(B) ); 結果を返す。 } int型のmain(){ 最初のint、第二; のprintf("二つの整数を入力してください:"); scanf関数("%dは%d"は、もの&、&2番目)。 のprintf("%dは&%dの最大公約数は%dは\ nを"第1、第2、GCD(第1、第2)); 0を返します。 }



































