タグ付けされた質問 「multithreading」

マルチスレッドとは、複数の同時実行ストリーム(一般にスレッドと呼ばれる)を利用して、コンピューターまたはプログラムが作業を同時にまたは非同期に実行する機能です。

13
num ++は 'int num'に対してアトミックですか?
一般ためにint num、num++(又は++num)、リード・モディファイ・ライト動作として、ある原子ではありません。しかし、GCCなどのコンパイラが次のコードを生成することがよくあります(ここで試してください)。 に対応する5行目num++は1つの命令なので、この場合num++ はアトミックであると結論付けることができますか? もしそうなら、それは、そのように生成num++されたデータレースの危険なしに同時(マルチスレッド)シナリオで使用できることを意味します(つまり、たとえば、それを作成する必要がなくstd::atomic<int>、関連するコストを課します。とにかくアトミック)? 更新 この質問はインクリメントがアトミックであるかどうかではないことに注意してください(そうではなく、それが問題の最初の行でした)。それはかどうかだことができ、特定の場合で1命令自然の缶はのオーバーヘッドを回避するために悪用されるかどうか、すなわち、特定のシナリオでも接頭辞を。そして、受け入れられた回答がユニプロセッサマシンに関するセクションで言及しているように、この回答と同様に、そのコメントでの会話や他の人が説明しているように、それは可能です(ただし、CまたはC ++ではできません)。lock

6
main()が終了すると、切り離されたスレッドはどうなりますか?
私はそれを開始しているstd::threadと仮定しdetach()て、それstd::threadが一度それを表していたとしても、スレッドがスコープ外になったとしても、スレッドは実行を続けます。 さらに、プログラムには、切り離されたスレッド1に参加するための信頼できるプロトコルがないため、main()終了時に切り離されたスレッドが引き続き実行されると仮定します。 1.10と30.3のどちらにも適切な表現が含まれておらず、何が起こるかを説明している標準(より正確には、N3797 C ++ 14ドラフト)には何も見つかりません。 1別の、おそらく同等の質問は、「デタッチされたスレッドを再び結合できるか」です。これは、どのプロトコルを結合しようと考えている場合でも、スレッドがまだ実行されている間にシグナリング部分を実行する必要があるため、OSスケジューラが受信側がスレッドが実際に終了したことを確実に検出する方法がなく、シグナリングが実行された直後に、スレッドを1時間スリープさせることにしました。 が不足している場合はmain()デタッチスレッドが実行されているとすると、未定義の動作で、その後、任意の使用は、std::thread::detach()メインスレッドが終了したことがない場合を除き、未定義の動作です2。 したがって、main()デタッチされたスレッドを実行して実行すると、定義された効果が必要になります。問題は次のとおりです。(C ++標準では、POSIXではなく、OSドキュメントではありません...)定義されている効果です。 2切り離されたスレッドは結合できません(の意味でstd::thread::join())。デタッチされたスレッドからの結果を待つことはできますが(たとえば、からstd::packaged_task、またはカウントセマフォまたはフラグと条件変数によって)、それはスレッドが実行を完了したことを保証するものではありません。あなたがスレッドの最初の自動オブジェクトのデストラクタにシグナリング部分を入れない限り、確かに、そこになり、一般的には、その実行コード(デストラクタ)も後のシグナリングコード。OSがメインスレッドをスケジュールして結果を消費し、デタッチされたスレッドがデストラクタの実行を完了する前に終了する場合、^ Wisはどのように定義されますか?

9
ベストプラクティス:方向変更中のAsyncTask
AsyncTask 別のスレッドで複雑なタスクを実行するのは素晴らしいことです。 ただし、のAsyncTask実行中に方向の変更や別の構成の変更があると、電流Activityは破棄されて再起動します。のインスタンスがAsyncTaskそのアクティビティに接続されているため、失敗し、「強制終了」メッセージウィンドウが表示されます。 したがって、これらのエラーを回避し、AsyncTaskが失敗するのを防ぐための何らかの「ベストプラクティス」を探しています。 これまでに見たのは、 向きの変更を無効にします(確かにこれを処理する方法ではありません)。 タスクを存続させ、新しいアクティビティインスタンスで更新する onRetainNonConfigurationInstance Activityが破棄されたときにタスクをキャンセルし、Activityが再度作成されたときにタスクを再起動するだけです。 タスクをアクティビティインスタンスではなくアプリケーションクラスにバインドする。 「シェルフ」プロジェクトで使用されるいくつかのメソッド(onRestoreInstanceState経由) いくつかのコード例: 画面回転中のAndroid AsyncTasks、パートIおよびパートII ShelvesActivity.java 問題を最もよく解決し、実装も簡単な最善の方法を見つけるのを手伝ってくれませんか?これを正しく解決する方法がわからないため、コード自体も重要です。

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); } } 直接現場に行き、複数のスレッドによる同時アクセスから保護するためのより良い解決策はありますか?

2
GDBのすべてのスレッドのバックトレースを取得するにはどうすればよいですか?
WinDbgの「!process 0 7」と同等のコマンドがGDBにありますか? GDBのバックトレースとともに、すべてのスレッドをダンプファイルに抽出したいと思います。「情報スレッド」はスタックトレースを出力しません。それで、それを行うコマンドはありますか?

6
enumerateObjectsUsingBlockとforを使用する場合
明らかな違いに加えて: enumerateObjectsUsingBlockインデックスとオブジェクトの両方が必要な場合に使用します enumerateObjectsUsingBlockローカル変数を変更する必要がある場合は使用しないでください(これは間違っていました。bbumの回答を参照してください) enumerateObjectsUsingBlock一般に、うまくいく場合は、より良いか悪いかと考えられますかfor (id obj in myArray)?長所/短所は何ですか(たとえば、多かれ少なかれパフォーマンスが良いなど)?

5
ロックされていないミューテックスのロックはどの程度効率的ですか?ミューテックスのコストはいくらですか?
低レベル言語(C、C ++など):ミューテックスの束(pthreadが提供するものやネイティブシステムライブラリが提供するものなど)とオブジェクトの単一のミューテックスのどちらを使用するかを選択できます。 ミューテックスをロックすることはどのくらい効率的ですか?つまり、アセンブラー命令はいくつありますか。また、それらにかかる時間(ミューテックスがロック解除されている場合)はどれくらいかかりますか? mutexの費用はいくらですか?ミューテックスを本当にたくさん持つのは問題ですか?または、私がint変数を持っているのと同じくらい多くのミューテックス変数をコードにスローすることはできますか? (ハードウェアの違いはどれくらいかわかりません。ある場合は、それについても知りたいのですが、ほとんどの場合、共通のハードウェアに興味があります。) 重要なのは、オブジェクト全体に対して単一のミューテックスではなく、オブジェクトの一部のみをカバーする多くのミューテックスを使用することで、多くのブロックを安全にできることです。そして、これについてどこまで行けばいいのかと思っています。つまり、どれほど複雑で、これが何個のミューテックスを意味するかに関係なく、可能なブロックを可能な限り安全に保護する必要がありますか? ロックに関するWebKitsブログ投稿(2016)は、この質問に非常に関連しており、スピンロック、アダプティブロック、futexなどの違いについて説明しています。


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


11
未来のリストを待っています
List先物を返すメソッドがあります List&lt;Future&lt;O&gt;&gt; futures = getFutures(); ここで、すべてのフューチャーが正常に処理されるか、フューチャーによって出力が返されるタスクのいずれかが例外をスローするまで待機します。1つのタスクが例外をスローしたとしても、他のフューチャーを待つ意味はありません。 単純なアプローチは wait() { For(Future f : futures) { try { f.get(); } catch(Exception e) { //TODO catch specific exception // this future threw exception , means somone could not do its task return; } } } ただし、ここでの問題は、たとえば、4番目のフューチャーが例外をスローした場合、最初の3つのフューチャーが使用可能になるまで不必要に待機します。 これを解決するには?カウントダウンラッチは何らかの形で役立ちますか?isDonejava docが言っているので、Futureを使用できません。 boolean isDone() Returns true if …

26
保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています
私は誰かがこのエラーを引き起こしている可能性があるものについて私を啓発してくれることを願っています: 保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。 このエラーはアプリケーションの任意のランダムな領域でスローされるようなので、実際にコードをポストすることはできません。アプリケーションは、エラーをスローする前に12〜48時間実行されます。一見ランダムなスポットで停止して上記のエラーをスローする場合もあれば、アプリケーション全体が停止し、「致命的なエラーが発生しました... CLRのバグまたは...」PInvokeやその他の関連性のない情報についての何か。これが発生すると、すべてのスレッドが終了したと表示され、利用可能なデバッグ情報はありません。 一言で言えば、これはアプリケーションが行うことです: 完全にC#で記述されたマルチスレッドサーバーアプリケーション。クライアントはソケット経由でサーバーに接続します。サーバーは、クライアントが相互に、また環境と対話できる仮想の「環境」を実行します。かなりのメモリを消費しますが、リークは発生しません。通常、約1.5 GBを消費します。アプリケーションが実行されている間、メモリ使用量は比較的一定に保たれるため、リークが発生するとは思いません。クライアントが何もしていなくても、環境を維持するために常に実行しているコード。サードパーティのソフトウェアやその他のAPIは使用していません。このアプリケーションが使用する唯一の外部リソースは、ソケット接続とSQLデータベース接続です。64ビットサーバーで実行されています。.net 2.0、3.5、および4を使用して、VS2008およびVS2010でこれをデバッグしてみました。 コンパイラの最適化といくつかのMicrosoftホットフィックスをオフにしてみました。この問題を解消するものは何もないようです。誰かが考えられる原因、または問題の原因を特定するための何らかの方法を知っていれば幸いです。

3
Parallel.ForEach()とforeach(IEnumerable <T> .AsParallel())の比較
Erg、私はReflectorを使用してBCLでこれら2つのメソッドを見つけようとしていますが、見つけることができません。これら2つのスニペットの違いは何ですか? A: IEnumerable&lt;string&gt; items = ... Parallel.ForEach(items, item =&gt; { ... }); B: IEnumerable&lt;string&gt; items = ... foreach (var item in items.AsParallel()) { ... } どちらを使用するかによって異なる影響はありますか?(両方の例の括弧で囲まれた本文で私がしていることはすべてスレッドセーフであると仮定します。)

11
「Java DateFormatはスレッドセーフではありません」これは何につながりますか?
Java DateFormatがスレッドセーフではないことについて誰もが警告し、概念を理論的に理解しています。 しかし、これが原因で私たちが直面する可能性のある実際の問題を視覚化することはできません。たとえば、クラスにDateFormatフィールドがあり、マルチスレッド環境のクラスの異なるメソッド(日付のフォーマット)で同じものが使用されているとします。 これが原因ですか: フォーマット例外などの例外 データの不一致 他の問題? また、その理由を説明してください。


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