2012-06-16 13 views
5

私は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は無用呼び出すことはありませんよね?

+1

http://en.wikipedia.org/wiki/Fetch-and-add – Mysticial

+1

http://en.wikipedia.org/wiki/Compare-and-swap – Mysticial

+2

アライメントされたアドレスへの 'movl'は常にアトミックですロックはまったく違いはありません。 – hirschhornsalz

答えて

12

、ソフトウェアのミューテックスを使用することであると思います。lock cmpxchgすることの基本的なビルディング・ブロックである、compare-and-swapを実行するための標準的な方法です多くの同期アルゴリズム。操作が有効になる前に

また、fetch-and-addを参照してください。

+0

ありがとうございます。確認してみるよ。 – Sean

5

lockの目的は、シリアライズ、操作はアトミックないようにすることです。このようにCPUを横取りすることができません。

+0

お返事ありがとうございます。私はこれらの用語についてはあまりよく分かりません。私は原子は、操作が全体的に行われることを意味すると思います。この問題では、たとえ "ロック追加"が原子的に行われたとしても、他のプロセッサが同時にそのメモリロケーションにアクセスできないことを意味するわけではありません。したがって、 "ロック"が行っていることは、同じメモリ位置への並列アクセスを防止することです。私はこれをシリアル化といい、すべてのスレッドがメモリにアクセスするようにしていると思います。 – Sean

+1

アトミック操作は、*シリアライゼーションに使用されるプリミティブですが、それら自体はシリアル化されません。シリアライゼーションとは、同じ操作を一度に1つずつ実行する複数のエンティティを指しますが、アトミック操作は、1つの個別の動作で任意の操作を実行し、他の操作は妨げません。 –

0

マルチプロセッサマシンでは、同じデータを使用する2つの並行プロセスがあり、同時に変更することはできません。

1つのプロセスがデータを変更しているときは、2番目のプロセスが変更を試みるときに最初のプロセスが完了するまで待つ必要があるように、その順番に自分自身。

これが少し助けてくれることを願っています。

2

x86プロセッサは、多くの機能、多くのルール、さらにはこれらのすべてのルールに対する例外を含む、毛深いデザインで知られています。これは家族にとって長い歴史に関連しています。

コンパイラまたは人々がLOCKを使用している場合、アルゴリズムは最終的に操作されるアプリケーションデータではなく、スレッド間の同期を実行するために特別に導入されたデータを常に使用しています。次に、スレッド同期プロトコルを、LOCKがそのために行うことができるものに適応させます。

あなたが探しているような一般的なタイプの命令は、memory barriersと呼ばれています。実際、x86にはこのファミリからのいくつかの「現代的な」命令があります(MFENCE、LFENCE、SFENCE)。それらは完全なフェンス、負荷フェンス、およびストアフェンスです。しかし、命令セットの重要性はSSEに制限されています。これは、インテルが命令セットの伝統的な部分の書き込みを直列化することを保証しているからであり、これがマルチスレッドプログラミングにとって非常に簡単なターゲットである理由です。

さらに詳しくは、this answerも参照してください。あなたが提供する例では

0

、あなたは(p%eaxに位置していると仮定して)このようなinc命令でlock接頭辞を使用することができます。より一般的なケースでは

lock inc (%eax) 

、あなたはしかし、ロックを使用する必要があります。

関連する問題