アセンブリのビット
読んだ後にこのロックフリーバッファについての記事を、CASの使用を見て(比較とスワップ)、私は同じようにアセンブリコードを投稿するように感じました。 ネイティブメソッドを記述し、Java(バック1.5、Javaの並行データ構造が多かれ少なかれ存在しない以外だったとき)からそれを呼び出すことがあった上のケースを使用しています。 さらに騒ぎがなければ、私はあなたにコードを解き放つよ
。 最初は、CAS用で、もう1つはユークリッドのアルゴリズム(このいずれかが同様に多くの場所とチュートリアルに記載されています)を使用して、コンピューティングGCDのためのものです。
コンパイルと実行命令を gcc file_name.c ; ./a.out
比較とスワップ
の#includeの#include / /交換 - 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 ;/ * CASが成功したことを図1に、それは/ *失敗したが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は\ n \ tをDONE" "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
の#includeint型GCD(int型1は、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"、第一、第二、GCD(第1、第2、第)); 0を返します。 }



































