Intelのマニュアルを読んだところ、命令にロックプレフィックスが付いていることがわかりました。これにより、プロセッサが同じメモリ位置に同時に書き込むのを防ぐことができます。とてもワクワクしています。ハードウェアのミューテックスとしても使えると思います。そこで、私はショットを撮るためのコードを書きました。結果は非常に苛立たしいものです。ロックはMOVまたはLEA命令をサポートしていません。マニュアルには、LOCKはADD、ADC、AND、BTC、BTR、BTS、CMPXCHG、CMPXCH8B、DEC、INC、NEG、NOT、OR、SBB、SUB、XOR、XADD、およびXCHGのみをサポートすると記載されています。さらに、これらの命令の1つでLOCKプレフィックスが使用され、ソースオペランドがメモリオペランドである場合、未定義のオペコード例外(#UD)が生成される可能性があります。
なぜこれほど多くの制限があり、多くの制限がLOCKを役に立たないように思わせるのだろうか。一般的な書き込み操作で、データのダーティや並列処理によるその他の問題が発生しないことを保証するために使用することはできません。
たとえば、Cでコード++(* p)を記述しました。pは共有メモリへのポインタです。対応するアセンブリは次のようになります。
movl 28(%esp), %eax
movl (%eax), %eax
leal 1(%eax), %edx
movl 28(%esp), %eax
movl %edx, (%eax)
「movl」と「leal」の前に「lock」を追加しましたが、プロセッサが「InvalidInstruction」と文句を言います。:-(書き込み操作をシリアル化する唯一の方法は、ソフトウェアのミューテックスを使用することだと思いますよね?