これは、software.intel.com の記事で、ユーザー レベルのロックにほとんど光を当てていません。
ユーザーレベルのロックには、プロセッサのアトミック命令を利用してメモリ空間をアトミックに更新することが含まれます。アトミック命令では、命令でロック プレフィックスを使用し、デスティネーション オペランドをメモリ アドレスに割り当てます。次の命令は、現在の Intel プロセッサでロック プレフィックスを使用してアトミックに実行できます: ADD、ADC、AND、BTC、BTR、BTS、CMPXCHG、CMPXCH8B、DEC、INC、NEG、NOT、OR、SBB、SUB、XOR、XADD、およびXCHG。[...] ほとんどの命令では、ロック プレフィックスを明示的に使用する必要があります。ただし、xchg 命令では、命令にメモリ アドレスが含まれる場合にロック プレフィックスが暗示されます。
Intel 486 プロセッサの時代には、バスのロックをアサートするためにロック プレフィックスが使用され、パフォーマンスが大幅に低下しました。Intel Pentium Pro アーキテクチャ以降、バス ロックはキャッシュ ロックに変換されます。最新のアーキテクチャでは、ロックがキャッシュ不可能なメモリに存在する場合、またはロックがキャッシュ ラインを分割するキャッシュ ライン境界を超えて拡張されている場合、ロックは依然としてバス上でアサートされます。これらのシナリオはどちらもありそうにないため、ほとんどのロック プレフィックスは、はるかに安価なキャッシュ ロックに変換されます。
では、別のコアがメモリ アドレスにアクセスするのを妨げているのは何でしょうか? キャッシュ コヒーレンシ プロトコルは、キャッシュ ラインのアクセス権を既に管理しています。そのため、コアがキャッシュ ラインへの (一時的な) 排他的アクセス権を持っている場合、他のコアはそのキャッシュ ラインにアクセスできません。そのキャッシュラインにアクセスするには、他のコアが最初にアクセス権を取得する必要があり、それらの権利を取得するためのプロトコルには現在の所有者が関与します。実際、キャッシュ コヒーレンシ プロトコルは、他のコアがキャッシュ ラインにサイレント アクセスするのを防ぎます。
ロックされたアクセスが単一のキャッシュ ラインにバインドされていない場合、事態はさらに複雑になります。ページ境界を越えたロックされたアクセスなど、あらゆる種類の厄介なコーナーケースがあります。Intel は詳細を明らかにしておらず、ロックを高速化するためにあらゆる種類のトリックを使用している可能性があります。