.netを初めて使用しますが、.netにAtomicInteger、ConcurrentLinkedQueueなどのJava版があるかどうかを知りたいですか?
私は少し検索をしましたが、何も思いつきませんでした。
ロックフリーアルゴリズムには、Javaの文書化されていないUnsafeクラスを通じて提供される、ある種のCAS命令が必要ですが、.netには同等のものがありますか?
.netを初めて使用しますが、.netにAtomicInteger、ConcurrentLinkedQueueなどのJava版があるかどうかを知りたいですか?
私は少し検索をしましたが、何も思いつきませんでした。
ロックフリーアルゴリズムには、Javaの文書化されていないUnsafeクラスを通じて提供される、ある種のCAS命令が必要ですが、.netには同等のものがありますか?
.NETには、静的メソッドInterlocked.Increment()およびInterlocked.Decrement()を持つInterlockedクラスがあります。
http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspxを参照してください。
System.Threading名前空間には、他のアトミックoch同期構造もあります。
私は.Netでロックフリーの不変のコレクション構造をたくさん書いてきました。これには、バイナリツリー、マップ、配列、リンクリストなどが含まれます...ソースとバイナリはコードギャラリーで入手できます。
Interlockedクラスには、インクリメント、デクリメント、比較、スワップなどの単純なアトミック操作を実行するために必要なすべての静的メソッドがあります。http ://msdn.microsoft.com/en-us/library/system.threading.interlocked_members.aspxを確認してください。
ほとんどのコレクションでは、「同期」と呼ばれる静的メンバーを介して同期コレクションを取得できます。ただし、これらはロックフリーの構造ではなく、ロック/セマフォを使用する際の煩わしさを隠すだけであることに注意してください。キューコレクションの同期メソッドhttp://msdn.microsoft.com/en-us/library/system.collections.queue.synchronized.aspxを確認します
これが.netのInterlockedクラスで見られる問題です。
カウンターを更新する複数のスレッドがあります。各スレッドはカウンターの一意の値を取得する必要があるため、同じ値を取得するスレッドはありません。
.netのインターロックされたクラスが機能する方法、私は持っています-
int counter;
void code(){
myThreadVal = Interlocked.increment(counter);
}
これで、両方のスレッドが同じ値のカウンターを認識できるため、両方のスレッドが同じ値のmyThreadValを取得できます。
ただし、発生しないJavaのAtomicIntegerの場合、各スレッドは常に異なる値を取得します。
情報については、.NET 4.0 がParallel Extensionsから CCR/TPL を継承する可能性が高い (こちら) 。特に、TPL は、高度なスレッド化シナリオ (最小限のロックなど) 用に設計された一連のコレクションとその他の構成要素を導入します。
今のところ、限られた数のスレッド化されたコレクションなどに加えて、通常のロック プリミティブに加えInterlocked
て などがあります。