4

2つのスレッドがまったく同じマイクロ秒(またはCPUスライスまたは命令を測定できる最小時間)で同じオブジェクトをロックしようとするとどうなりますか?

2つのスレッドがまったく同時に命令を実行することさえ可能ですか、それとも今日のハードウェアでは不可能ですか?

私は、muitithreadingを扱うプロジェクトに取り組んでいます。このプロジェクトでは、いわば、どのスレッドも他のスレッドを打ち負かす可能性があります。当然のことながら、「すべてが同時にロックされるとどうなるのか」という質問です。IMOに対処する必要があります。

4

2 に答える 2

7

これは不可能であり、ロックは彼らが約束したことを行うことができませんでした。複数のコアが同時に同じメモリ位置にアクセスしようとしないようにすることができるのはプロセッサのみであるため、これにはプロセッサのサポートが必要です。例として、このビットのアセンブリコードがあります。これは、x86バージョンのCLRでMonitor.TryEnter()メソッドで使用されます。

FASTCALL_FUNC CompareExchangeUP,12
        _ASSERT_ALIGNED_4_X86 ecx
        mov     eax, [esp+4]    ; Comparand
        cmpxchg [ecx], edx
        retn    4               ; result in EAX
FASTCALL_ENDFUNC CompareExchangeUP

cmpxchgプロセッサ命令は、アトミック性の保証を提供します。これは、現代のコアが持つ種類の命令であり、その一般的な名前は「コンペアアンドスワップ」です。この手順の詳細については、このウィキペディアの記事を参照してください。

于 2012-07-28T17:23:11.540 に答える
3

最新のロックは、ほとんどすべての環境で、2つのスレッドが同時にオブジェクトをロックできないように設計されています。最近のプロセッサで、2つの異なるコアで実行されている2つのスレッドがほぼ同時にロックを取得しようとする可能性がありますが、それらはすべて、ソフトウェアがロックを許可しないように指示できる同期メカニズムを実装しています。

たとえば、x86-64にはMONITORおよびMWAIT命令があります。これらは基本的に、マイクロプロセッサレベルで、.NETのおよびのセマンティクスを実装lock(){}System.Threading.Monitor.Wait()ますSystem.Threading.Monitor.Enter()/.Exit()

于 2012-07-28T16:40:44.763 に答える