タグ付けされた質問 「thread-safety」

複数のスレッドによるこのコードの一貫した実行を可能にする方法でのみデータ構造を操作する場合、コードの一部はスレッドセーフです。コードは、スレッドセーフ、条件付きで安全(相互排除が必要)、または安全ではない(1つのスレッドだけが安全に使用できる)場合があります。

16
コレクションが変更されました。列挙操作が実行されない可能性があります
デバッガーが接続されていると発生しないように見えるため、このエラーの原因を突き止めることはできません。以下はコードです。 これは、WindowsサービスのWCFサーバーです。NotifySubscribersメソッドは、データイベントが発生するたびにサービスによって呼び出されます(ランダムな間隔ですが、それほど頻繁ではありません-1日に約800回)。 Windowsフォームクライアントがサブスクライブすると、サブスクライバーIDがサブスクライバーディクショナリに追加され、クライアントがサブスクライブを解除すると、ディクショナリーから削除されます。このエラーは、クライアントが登録解除したとき(またはその後)に発生します。次にNotifySubscribers()メソッドが呼び出されたときに、foreach()ループが失敗し、件名のエラーが表示されます。このメソッドは、以下のコードに示すように、エラーをアプリケーションログに書き込みます。デバッガーが接続され、クライアントがサブスクライブを解除すると、コードは正常に実行されます。 このコードに問題がありますか?辞書をスレッドセーフにする必要がありますか? [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] public class SubscriptionServer : ISubscriptionServer { private static IDictionary<Guid, Subscriber> subscribers; public SubscriptionServer() { subscribers = new Dictionary<Guid, Subscriber>(); } public void NotifySubscribers(DataRecord sr) { foreach(Subscriber s in subscribers.Values) { try { s.Callback.SignalData(sr); } catch (Exception e) { DCS.WriteToApplicationLog(e.Message, System.Diagnostics.EventLogEntryType.Error); UnsubscribeEvent(s.ClientId); } } } public …


8
ロックはどのように正確に機能しますか?
スレッドセーフではないオブジェクトを使用する場合、次のようなロックでコードをラップすることがわかります。 private static readonly Object obj = new Object(); lock (obj) { // thread unsafe code } したがって、複数のスレッドが同じコードにアクセスするとどうなりますか(ASP.NET Webアプリケーションで実行されていると仮定しましょう)。彼らはキューに入っていますか?もしそうなら、彼らはどれくらい待つでしょうか? ロックを使用することによるパフォーマンスへの影響は何ですか?

3
RxJavaスケジューラの使用例
RxJavaには、5つの異なるスケジューラーから選択できます。 immediate():現在のスレッドですぐに作業を実行するスケジューラを作成して返します。 trampoline():現在の作業が完了した後に実行される現在のスレッドで作業をキューに入れるスケジューラを作成して返します。 newThread():作業単位ごとに新しいスレッドを作成するスケジューラを作成して返します。 Calculation():計算作業を目的としたスケジューラを作成して返します。これは、イベントループ、コールバックの処理、およびその他の計算作業に使用できます。このスケジューラでIOバインド作業を実行しないでください。スケジューラを使用します。代わりにio()。 io():IOにバインドされた作業を目的としたスケジューラを作成して返します。実装は、必要に応じて拡張されるエグゼキュータスレッドプールによってサポートされます。これは、ブロッキングIOを非同期で実行するために使用できます。このスケジューラで計算作業を実行しないでください。スケジューラを使用します。代わりに計算()。 質問: 最初の3つのスケジューラは自明です。ただし、計算とioについて少し混乱しています。 「IOバウンド作業」とは正確には何ですか?ストリーム(java.io)およびファイル(java.nio.files)の処理に使用されますか?データベースクエリに使用されますか?ファイルのダウンロードやREST APIへのアクセスに使用されますか? どのように計算は()とは異なる)newThread( ?それはすべての計算です()呼び出しが毎回新しい(バックグラウンド)スレッドではなく単一の(バックグラウンド)スレッド上にあるのですか? IO作業を行うときに計算()を呼び出すのはなぜ悪いのですか? 計算作業を行うときにio()を呼び出すのはなぜ悪いのですか?

7
再入可能関数とは正確には何ですか?
ほとんど の 時間は、再入の定義はから引用されウィキペディア: コンピュータプログラムまたはルーチンは、以前の呼び出しが完了する前に安全に再度呼び出すことができる(つまり、同時に安全に実行できる)場合、再入可能 と呼ばれます。再入可能であるためには、コンピュータプログラムまたはルーチン: 静的(またはグローバル)非定数データを保持してはなりません。 静的(またはグローバル)非定数データにアドレスを返してはなりません。 呼び出し元から提供されたデータのみを処理する必要があります。 シングルトンリソースへのロックに依存してはなりません。 独自のコードを変更してはなりません(独自のスレッドストレージで実行する場合を除く) 非再入可能コンピュータプログラムまたはルーチンを呼び出さないでください。 安全にどのように定義されていますか? プログラムを安全に並行して実行できる場合、それは常に再入可能であることを意味しますか? 再入可能機能についてコードをチェックする際に留意する必要がある、言及された6つのポイント間の一般的なスレッドは正確に何ですか? また、 すべての再帰関数は再入可能ですか? すべてのスレッドセーフ関数は再入可能ですか? すべての再帰的でスレッドセーフな関数は再入可能ですか? この質問を書いていると、1つのことが頭に浮かびます。再入可能性やスレッドセーフティなどの用語は絶対的なものですか。具体的な定義が固定されているのでしょうか。そうでない場合、この質問はあまり意味がありません。

11
オブジェクトまたはメソッドのJava同期メソッドロック?
同じクラスに2つの同期されたメソッドがあり、それぞれが異なる変数にアクセスしている場合、2つのスレッドがそれらの2つのメソッドに同時にアクセスできますか?ロックはオブジェクトで発生しますか、それとも同期メソッド内の変数と同じくらい具体的になりますか? 例: class X { private int a; private int b; public synchronized void addA(){ a++; } public synchronized void addB(){ b++; } } 2つのスレッドが実行クラスXの同じインスタンスにアクセスすることができますx.addA()とx.addB()同じ時間に?

7
Queue.Queueとcollections.deque
複数のスレッドがデータを入れることができるキューが必要です。複数のスレッドがそこから読み取ることができます。 Pythonには少なくともQueue.Queueとcollections.dequeの2つのキュークラスがあり、前者は後者を内部的に使用しているようです。どちらもドキュメントではスレッドセーフであると主張しています。 ただし、キューのドキュメントにも次のように記載されています。 collections.dequeは、ロックを必要としない高速のアトミックなappend()およびpopleft()操作を備えた、無制限のキューの代替実装です。 私はまったく理解していないと思います:これは、結局、dequeが完全にスレッドセーフではないことを意味しますか? もしそうなら、私は2つのクラスの違いを完全に理解していないかもしれません。Queueがブロッキング機能を追加していることがわかります。一方で、オペレーター内のサポートなど、いくつかの必要な機能が失われます。 内部の両端キューオブジェクトに直接アクセスするのは、 Queue()。dequeのx スレッドセーフ? また、dequeがすでにスレッドセーフであるのに、なぜQueueはその操作にミューテックスを使用するのですか?

9
InvokeRequiredコードパターンの自動化
イベント駆動型GUIコードで次のコードパターンを記述する必要がある頻度を痛感しました。 private void DoGUISwitch() { // cruisin for a bruisin' through exception city object1.Visible = true; object2.Visible = false; } になる: private void DoGUISwitch() { if (object1.InvokeRequired) { object1.Invoke(new MethodInvoker(() => { DoGUISwitch(); })); } else { object1.Visible = true; object2.Visible = false; } } これは、覚えたり入力したりするための、C#での厄介なパターンです。誰かがこれをある程度自動化する何らかのショートカットや構造を思いついたことがありますか?object1.InvokeIfNecessary.visible = trueタイプショートカットのように、この追加のすべての作業を行わずに、このチェックを行う関数をオブジェクトにアタッチする方法があったら、すばらしいでしょう。 前の答えはちょうどたびに呼び出しを()を呼び出すの非現実を議論してきた、とさえ[起動()構文が非効率的との両方で、まだ対処しにくいです。 それで、誰かがショートカットを見つけましたか?

4
メソッドをスレッドセーフにするもの ルールは何ですか?
メソッドをスレッドセーフにするための全体的なルール/ガイドラインはありますか?おそらく100万回の単発的な状況があることを理解していますが、一般的にはどうですか?これは簡単ですか? メソッドがローカル変数にのみアクセスする場合、それはスレッドセーフです。 それですか?それは静的メソッドにも適用されますか? @Cybisによって提供された1つの回答は次のとおりです。 各スレッドは独自のスタックを取得するため、ローカル変数はスレッド間で共有できません。 静的メソッドの場合もそうですか? メソッドに参照オブジェクトが渡された場合、それはスレッドの安全性を損ないますか?私はいくつかの調査を行いましたが、特定のケースについてはたくさんありますが、いくつかのルールを使用するだけで、メソッドがスレッドセーフであることを確認するために従うガイドラインを定義できることを望んでいました。 したがって、私の究極の質問は、「スレッドセーフなメソッドを定義するルールの短いリストはありますか?ある場合、それは何ですか?」 編集 多くの良い点がここで作られました。この質問に対する本当の答えは、「スレッドの安全性を確保するための単純なルールはない」と思います。涼しい。いいよ。しかし、一般的に私は、受け入れられた答えが良い、短い要約を提供すると思います。常に例外があります。だからそれである。私はそれと共存できます。
156 c#  thread-safety 

5
ConcurrentHashMap値の反復はスレッドセーフですか?
ConcurrentHashMapの javadoc は次のとおりです。 通常、取得操作(getを含む)はブロックされないため、更新操作(putおよびremoveを含む)と重複する場合があります。取得は、その開始時に保留されている最後に完了した更新操作の結果を反映します。putAllやclearなどの集約操作の場合、同時取得は一部のエントリのみの挿入または削除を反映する場合があります。同様に、イテレータと列挙は、イテレータ/列挙の作成以降のある時点でのハッシュテーブルの状態を反映する要素を返します。ConcurrentModificationExceptionはスローされません。ただし、イテレータは一度に1つのスレッドのみが使用するように設計されています。 どういう意味ですか?2つのスレッドで同時にマップを反復しようとするとどうなりますか?反復中にマップに値を追加またはマップから削除するとどうなりますか?

5
.NET Frameworkの同時HashSet <T>?
次のクラスがあります。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); } "Data"フィールドを別のスレッドから変更する必要があるので、現在のスレッドセーフな実装についていくつかの意見をお願いします。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); public void Add(string Val){ lock(Data) Data.Add(Val); } public void Remove(string Val){ lock(Data) Data.Remove(Val); } } 直接現場に行き、複数のスレッドによる同時アクセスから保護するためのより良い解決策はありますか?


5
非同期の静的メソッドは、静的クラス変数を変更しない場合、スレッドセーフですか?
私はあなたがされた静的メソッドがあればと思いましていない同期が、ないではない任意の静的変数を変更し、それは、スレッドセーフでありますか?メソッドがその中にローカル変数を作成する場合はどうでしょうか?たとえば、次のコードはスレッドセーフですか? public static String[] makeStringArray( String a, String b ){ return new String[]{ a, b }; } したがって、2つのスレッドが継続的かつ同時にメソッドを呼び出す場合、1つは犬(「グレートデーン」と「ブルドッグ」など)で、もう1つは猫(「ペルシャ」と「シャム」など)で、猫と犬を取得します同じ配列で?または、猫と犬がメソッドの同じ呼び出し内に同時に存在することはありませんか?

8
!=チェックスレッドは安全ですか?
などの複合操作i++は複数の操作を伴うため、スレッドセーフではありません。 しかし、それ自体で参照をチェックすることはスレッドセーフな操作ですか? a != a //is this thread-safe 私はこれをプログラムして複数のスレッドを使用しようとしましたが、失敗しませんでした。私のマシンではレースをシミュレートできなかったと思います。 編集: public class TestThreadSafety { private Object a = new Object(); public static void main(String[] args) { final TestThreadSafety instance = new TestThreadSafety(); Thread testingReferenceThread = new Thread(new Runnable() { @Override public void run() { long countOfIterations = 0L; while(true){ boolean …

4
GsonインスタンスをモデルBeanの静的フィールドとして使用しても問題ありませんか(再利用)。
これが私が実装したモデルです: public class LoginSession { private static final Gson gson = new Gson(); private String id; private String name; private long timestamp; public LoginSession(String id, String name) { this.id = id; this.name = name; this.timestamp = System.currentTimeMillis(); } public String toJson() { return gson.toJson(this); } public static LoginSession fromJson(String json) …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.