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

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

5
iOSスタートバックグラウンドスレッド
iOSデバイスに小さなsqlitedbがあります。ユーザーがボタンを押すと、sqliteからデータをフェッチしてユーザーに表示します。 このフェッチ部分は、バックグラウンドスレッドで実行したい(UIメインスレッドをブロックしないため)。私はそのようにします- [self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids]; 取得して少し処理した後、UIを更新する必要があります。ただし、(良い方法として)バックグラウンドスレッドからUIの更新を実行しないでください。私はselectorそうメインスレッドで呼び出す- [self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO]; しかし、私のアプリは最初のステップでクラッシュします。つまり、バックグラウンドスレッドを開始します。これはiOSでバックグラウンドスレッドを開始する方法ではありませんか? 更新1:[self performSelectorInBackground....このスタックトレースを取得した後、情報はありません- 更新2:私も試し、バックグラウンドスレッドをそのように開始しました [NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];。 明確にするために、この操作をメインスレッドで実行すると、すべてがスムーズに実行されます... UPDATE 3これは私がバックグラウンドから実行しようとしている方法です - (void)getResultSetFromDB:(NSMutableArray *)toProceessDocids { SpotMain *mirror = [[SpotMain alloc] init]; NSMutableArray *filteredDocids = toProceessDocids; if(![gMediaBucket isEqualToString:@""]) filteredDocids = [mirror FetchDocIdsForMediaBucketWithDocID:filteredDocids mBucket:gMediaBucket numRes:-1]; if(![gMediaType isEqualToString:@""]) filteredDocids = [mirror FetchDocIdsForMediaType:filteredDocids mediaType:gMediaType …

1
C ++ 11のasync(launch :: async)は、高価なスレッドの作成を回避するためにスレッドプールを廃止しますか?
それはこの質問に緩く関連しています:std :: threadはC ++ 11にプールされていますか?。質問は異なりますが、意図は同じです。 質問1:高価なスレッドの作成を回避するために、独自の(またはサードパーティのライブラリ)スレッドプールを使用することはまだ意味がありますか? 他の質問の結論は、std::threadプールに依存することはできないということでした(そうでない場合もあります)。ただし、std::async(launch::async)プールされる可能性ははるかに高いようです。 それは標準によって強制されているとは思わないが、私見では、スレッドの作成が遅い場合は、すべての優れたC ++ 11実装がスレッドプーリングを使用すると予想します。新しいスレッドを作成するのが安価なプラットフォームでのみ、私は彼らが常に新しいスレッドを生成することを期待します。 質問2:これは私が考えていることですが、それを証明する事実はありません。私はよく間違えられるかもしれません。それは教育を受けた推測ですか? 最後に、ここでは、スレッドの作成が次のように表現できると私が考える方法を最初に示すサンプルコードをいくつか提供しましたasync(launch::async)。 例1: thread t([]{ f(); }); // ... t.join(); なる auto future = async(launch::async, []{ f(); }); // ... future.wait(); 例2:スレッドを起動して忘れる thread([]{ f(); }).detach(); なる // a bit clumsy... auto dummy = async(launch::async, []{ f(); }); // ... but …

9
非ブロッキングI / Oは、マルチスレッドのブロッキングI / Oよりも本当に高速ですか?どうやって?
ブロックI / Oと非ブロックI / Oに関するいくつかの技術的な詳細でWebを検索したところ、非ブロックI / OはブロックI / Oよりも高速であると述べた人が何人か見つかりました。このドキュメントの例です。 ブロックI / Oを使用する場合、もちろん現在ブロックされているスレッドは他に何もできません...ブロックされているためです。ただし、スレッドがブロックされ始めるとすぐに、OSは別のスレッドに切り替えることができ、ブロックされたスレッドに対して何かするまで、元に戻せません。したがって、CPUを必要とし、ブロックされていない別のスレッドがシステムにある限り、イベントベースの非ブロックアプローチと比較して、CPUアイドル時間はこれ以上ないはずです。 CPUがアイドル状態である時間を減らすことに加えて、特定の時間枠でコンピューターが実行できるタスクの数を増やすためのもう1つのオプションがあります。スレッドの切り替えによって生じるオーバーヘッドを減らします。しかし、これをどのように行うことができますか?そして、オーバーヘッドは測定可能な効果を示すのに十分な大きさですか?これが私がそれをどのように機能させるかについてのアイデアです: ファイルの内容をロードするために、アプリケーションはこのタスクをイベントベースのI / Oフレームワークに委任し、ファイル名とともにコールバック関数を渡します イベントフレームワークはオペレーティングシステムに委任します。オペレーティングシステムは、ファイルをメモリに直接書き込むようにハードディスクのDMAコントローラをプログラムします。 イベントフレームワークにより、さらにコードを実行できます。 ディスクからメモリへのコピーが完了すると、DMAコントローラが割り込みを発生させます。 オペレーティングシステムの割り込みハンドラは、ファイルがメモリに完全に読み込まれていることをイベントベースのI / Oフレームワークに通知します。それはどのように行うのですか?信号を使用していますか? イベントI / Oフレームワーク内で現在実行されているコードが終了します。 イベントベースのI / Oフレームワークはキューをチェックし、ステップ5のオペレーティングシステムのメッセージを確認して、ステップ1で取得したコールバックを実行します。 それはどのように機能しますか?そうでない場合、どのように機能しますか?つまり、スタックを明示的に操作する必要なく、イベントシステムが機能できるということです(スレッドを切り替えながらスタックをバックアップし、別のスレッドのスタックをメモリにコピーする必要がある実際のスケジューラなど)。これで実際にどれだけの時間を節約できますか?もっとありますか?

6
GCDの並行キューとシリアルキュー
GCDの並行キューとシリアルキューを完全に理解するのに苦労しています。私にはいくつかの問題があり、誰かがはっきりとその時点で私に答えてくれることを願っています。 私は、シリアルキューが次々とタスクを実行するために作成および使用されることを読んでいます。ただし、次の場合はどうなりますか。 シリアルキューを作成します dispatch_async(作成したばかりのシリアルキューで)3回使用して、3つのブロックA、B、Cをディスパッチします 3つのブロックが実行されますか: キューがシリアルであるため、順序A、B、C または 並行して(並列スレッドで同時に)、ASYNCディスパッチを使用したため dispatch_syncブロックを次々に実行するために並行キューで使用できることを読んでいます。その場合、シリアルキューが存在するのはなぜですか?必要なだけブロックをSYNCHRONOUSLYディスパッチできるコンカレントキューを常に使用できるので、なぜですか? 良い説明ありがとうございます!

5
CancellationTokenプロパティの使用方法は?
前のクラスRulyCancelerのコードと比較して、を使用してコードを実行したいと思いました CancellationTokenSource。 キャンセルトークンで説明されているように、つまり例外をスロー/キャッチせずにそれを使用するにはどうすればよいですか?IsCancellationRequestedプロパティを使用できますか? 私はそれを次のように使用しようとしました: cancelToken.ThrowIfCancellationRequested(); そして try { new Thread(() => Work(cancelSource.Token)).Start(); } catch (OperationCanceledException) { Console.WriteLine("Canceled!"); } しかし、これによりcancelToken.ThrowIfCancellationRequested();メソッドで実行時エラーが発生しましたWork(CancellationToken cancelToken): System.OperationCanceledException was unhandled Message=The operation was canceled. Source=mscorlib StackTrace: at System.Threading.CancellationToken.ThrowIfCancellationRequested() at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33 at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, …

6
shared_mutexのブーストの例(複数の読み取り/ 1つの書き込み)?
いくつかのデータを頻繁に読み取らなければならないマルチスレッドアプリがあり、そのデータが更新されることもあります。現在、ミューテックスはそのデータへのアクセスを安全に保ちますが、複数のスレッドが同時に読み取れるようにし、更新が必要な場合にのみロックアウトする必要があるため、コストがかかります(更新スレッドは他のスレッドが完了するのを待つことができます) 。 これはboost::shared_mutex本来あるべきことだと思いますが、使い方がよく分からず、具体的な例もわかりません。 開始するために使用できる簡単な例はありますか?


7
PyQtアプリケーションでのスレッド化:QtスレッドまたはPythonスレッドを使用しますか?
Web接続を介して定期的にデータを取得するGUIアプリケーションを作成しています。この取得にはしばらく時間がかかるため、取得プロセス中にUIが応答しなくなります(小さい部分に分割することはできません)。これが、別のワーカースレッドへのWeb接続を外部委託したい理由です。 [はい、わかりました。今、2つの問題があります。] とにかく、アプリケーションはPyQt4を使用しているので、Qtのスレッドを使用するthreadingか、Python モジュールを使用するのがよいでしょうか。それぞれの長所/短所は何ですか?それともまったく違う提案がありますか? 編集(報奨金):私の特定のケースでの解決策はおそらく、Jeff OberやLukášLalinskýが提案するような非ブロッキングネットワークリクエストを使用することになるでしょう(したがって、基本的に同時実行性の問題はネットワークの実装に任せます)。一般的な質問に対する詳細な回答: (threadingモジュールの)ネイティブPythonスレッドよりもPyQt4(つまりQt)のスレッドを使用する利点と欠点は何ですか? 編集2:回答ありがとうございます。100%の合意はありませんが、答えは「use Qt」であるという広範なコンセンサスがあるようです。その利点は、他のライブラリとの統合であり、実際の欠点はありません。 2つのスレッドの実装の間で選択するために探している人のために、私は非常に彼らはPyQtはメーリングリストのスレッドを含め、ここで提供されるすべての答え、読んでお勧めアボットのリンクにします。 私が賞金について検討したいくつかの回答がありました。結局、私は非常に関連性の高い外部参照のために修道院長を選びました。しかし、それは危機一髪でした。 再度、感謝します。

3
スレッド終了コードとは何ですか?
デバッグ中の出力ウィンドウのスレッド終了コードとは正確には何ですか?それは私にどんな情報を与えますか?それは何とか便利なのですか、それとも私を困らせるべきではない内部的なものですか? The thread 0x552c has exited with code 259 (0x103). The thread 0x4440 has exited with code 0 (0x0). 可能性のある終了コードとその重要性のある種のリストはあるのでしょうか?

9
.NET MemoryCacheを適切に使用するためのロックパターン
このコードには同時実行の問題があると思います: const string CacheKey = "CacheKey"; static string GetCachedData() { string expensiveString =null; if (MemoryCache.Default.Contains(CacheKey)) { expensiveString = MemoryCache.Default[CacheKey] as string; } else { CacheItemPolicy cip = new CacheItemPolicy() { AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(20)) }; expensiveString = SomeHeavyAndExpensiveCalculation(); MemoryCache.Default.Set(CacheKey, expensiveString, cip); } return expensiveString; } 並行性の問題の理由は、複数のスレッドがnullキーを取得してから、データをキャッシュに挿入しようとする可能性があるためです。 このコードの同時実行性を証明する最も簡単でクリーンな方法は何でしょうか?私はキャッシュ関連のコード全体で良いパターンに従うのが好きです。オンライン記事へのリンクは非常に役立ちます。 更新: @Scott Chamberlainの回答に基づいてこのコードを思いつきました。誰かがこれでパフォーマンスまたは同時実行の問題を見つけることができますか?これがうまくいけば、コードやエラーの多くの行を節約できます。 …

2
Javaのマルチスレッド環境での静的メソッドの動作
私を悩ませ、私の心の中でいくつかの議論をする単純な愚かな質問があります。以下の質問に対する疑問をすべて捨てたいと思います。 class Clstest{ public static String testStaticMethod(String inFileStr) { // section 0 // section 1 // do something with inFileStr // section 2 // section 3 return inFileStr; } } 5つのスレッドがそれぞれClstest.testStaticMethod("arg-n")同時に呼び出しを実行していると仮定します。 スレッド1が呼び出しますClstest.testStaticMethod("arg-1")。 スレッド1がセクション1にある場合、スレッド2はを呼び出しますClstest.testStaticMethod("arg-2")。 次に、スレッド1はどうなりますか?スリープ状態になりますか? スレッド1がチャンスを得たとき、一時停止したセクション1から実行を再開しますか? 1がありますとき、どのようにそれが起こるClstest.testStaticMethodと同じことがClstest.testStaticMethod、すべての5つのスレッド間で共有されていますか? inFileStr複数のスレッドによって送信されたものを交換する可能性はありますか?


1
NSDefaultRunLoopModeとNSRunLoopCommonModes
背後UIScrollViewにある大きなファイルなどをダウンロードしようとするMPMapViewと、iPhoneの画面に触れるとすぐにダウンロードプロセスが停止します。ありがたいことに、Jörnによる素晴らしいブログ投稿がNSRunLoopCommonModes、接続に使用する代替オプションを提案しています。 これにより、NSDefaultRunLoopModeとNSRunLoopCommonModesの2つのモードの詳細を調べることができますが、アップルのドキュメントでは、 NSDefaultRunLoopMode NSConnectionオブジェクト以外の入力ソースを処理するモード。これは、最も一般的に使用される実行ループモードです。 NSRunLoopCommonModes この値をモードとして使用して実行ループに追加されたオブジェクトは、「共通」モードのセットのメンバーとして宣言されているすべての実行ループモードによって監視されます。詳細については、CFRunLoopAddCommonModeの説明を参照してください。 CFRunLoopAddCommonMode ソース、タイマー、オブザーバーは1つ以上の実行ループモードに登録され、実行ループがこれらのモードのいずれかで実行されている場合にのみ実行されます。共通モードは、これらのモードで共有されるソース、タイマー、オブザーバーのセットを定義できる実行ループモードのセットです。たとえば、特定の実行ループモードごとにソースを登録する代わりに、ソースを実行ループの共通疑似モードに一度登録すると、共通モードセットの各実行ループモードに自動的に登録されます。同様に、モードが共通モードのセットに追加されると、共通の疑似モードにすでに登録されているソース、タイマー、またはオブザーバーは、新しく追加された共通モードに追加されます。 誰かが人間の言語で2つを説明できますか?


4
AsyncTaskスレッドが死ぬことはありません
AsyncTaskユーザーがボタンを押したことに応答して、sを使用してデータをフェッチしています。これはうまく機能し、データのフェッチ中にインターフェイスの応答性を維持しますが、Eclipseデバッガーで何が行われているのかを確認したところ、新しいものAsyncTaskが作成されるたびに(多くの場合、一度しか使用できないため) )、新しいスレッドが作成されていましたが、終了されませんでした。 その結果、AsyncTaskそこに座っているだけで多数のスレッドができます。これが実際に問題であるかどうかはわかりませんが、これらの余分なスレッドを取り除きたいと思います。 これらのスレッドを強制終了するにはどうすればよいですか?

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