質問

BeOSプログラマーとしての日々、 Benoit Schillingsによるこの記事、「ベナフォア」の作成方法について説明します。アトミック変数を使用して、共通のミューテックスを取得/解放する必要のないクリティカルセクションを実施する方法競合)ケース。

それはかなり巧妙だと思ったので、アトミックなインクリメント/デクリメントをサポートするどのプラットフォームでも同じトリックができるようです。

一方で、これは標準のmutex実装自体に簡単に含めることができるもののように見えます。この場合、このロジックをプログラムに実装することは冗長であり、何の利点もありません。

最新のロックAPI(pthread_mutex_lock()/ pthread_mutex_unlock()など)がこのトリックを内部で使用しているかどうかは誰にもわかりませんか?そうでない場合、なぜですか?

役に立ちましたか?

解決

あなたの記事が説明していることは、今日一般的に使用されています。ほとんどの場合、" クリティカルセクション&quot ;そして、インターロックされた変数、一連のフラグ、および内部同期オブジェクト(正しく覚えていれば、Mutex)で構成されています。通常、競合の少ないシナリオでは、カーネル同期オブジェクトを使用せずに、クリティカルセクションが完全にユーザーモードで実行されます。これにより、高速実行が保証されます。競合が激しい場合は、カーネルオブジェクトが待機に使用されます。これにより、タイムスライスが解放され、ターンアラウンドが高速化されます。

一般に、この時代に同期プリミティブを実装する意味はほとんどありません。オペレーティングシステムにはさまざまなオブジェクトが付属しており、1人のプログラマが想像するよりもはるかに幅広いシナリオで最適化およびテストされています。優れた同期メカニズムを発明、実装、テストするには、文字通り何年もかかります。試してみる価値がないと言っているわけではありません:)

他のヒント

Javaの AbstractQueuedSynchronizer (およびその兄弟 AbstractQueuedLongSynchronizer )は同様に機能するか、少なくとも同様に実装できます。 これらの型は、 ReentrantLock および FutureTask

アトミック整数を使用して状態を表す方法で動作します。ロックは、値0をロック解除、1をロックとして定義できます。ロックを取得しようとするスレッドは、アトミック compare-and-set 操作を介してロック状態を0から1に変更しようとします。試行が失敗した場合、現在の状態は0ではありません。これは、ロックが他のスレッドによって所有されていることを意味します。

AbstractQueuedSynchronizer は、 CLHキューを維持することにより、ロックの待機と条件の通知も容易にします。ロックの取得または条件を介した通知の受信を待機しているスレッド。このような通知は、条件で待機しているスレッドの1つまたはすべてを、関連するロックの取得を待機しているスレッドのキューの先頭に移動します。

この機構の

ほとんどは、状態を表すアトミック整数と各待機キューのアトミックポインターの観点から実装できます。どのスレッドが状態変数を検査および変更するために競合するかの実際のスケジューリング(たとえば、 AbstractQueuedSynchronizer#tryAcquire(int) )は、このようなライブラリの範囲外であり、ホストシステムに分類されますスケジューラ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top