私はIntelのマニュアルを読んで、指示のためのロックプレフィックスがあることが判明しました。これはプロセッサが同じメモリ位置に同時に書き込むのを防ぐことができます。私はそれについてとても興奮しています。私はそれがハードウェアミューテックスとして使用できると思います。だから私はショットを取るコードを書いた。結果は非常にイライラしています。ロックはMOV命令またはLEA命令をサポートしていません。マニュアルでは、ADD、ADC、AND、BTC、BTR、BTS、CMPXCHG、CMPXCH8B、DEC、INC、NEG、NOT、OR、SBB、SUB、XOR、XADD、およびXCHGのみをサポートしています。さらに、LOCK接頭辞がこれらの命令の1つと共に使用され、ソース・オペランドがメモリ・オペランドである場合、未定義オペコード例外(#UD)が生成されることがあります。Intel命令のLOCKプレフィックス。ポイントは?
私はなぜそんなに多くの制限、多くの制限がロックを役に立たないように見えるのだろうか。私はそれを使用して一般的な書き込み操作を保証することはできませんデータやその他の並列性に起因する問題がない。
など。私はC.でコード++(* p)を書いています。pは共有メモリへのポインタです。対応するアセンブリがのようなものです:
movl 28(%esp), %eax
movl (%eax), %eax
leal 1(%eax), %edx
movl 28(%esp), %eax
movl %edx, (%eax)
私は「MOVL」の前に「ロック」と「レアル」追加しましたが、プロセッサは、「無効な命令を」文句を言います。 :-(私は操作がシリアライズ書き込みを行うための唯一の方法は、私は確かにlock
は無用呼び出すことはありませんよね?
http://en.wikipedia.org/wiki/Fetch-and-add – Mysticial
http://en.wikipedia.org/wiki/Compare-and-swap – Mysticial
アライメントされたアドレスへの 'movl'は常にアトミックですロックはまったく違いはありません。 – hirschhornsalz