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

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

2
Java ThreadPoolExecutor:コアプールサイズを更新すると、着信タスクが断続的に動的に拒否される
ThreadPoolExecutorプールの作成後にのコアプールサイズを別の数値に変更しようとすると、タスクの数をRejectedExecutionException超えて送信しなくても、一部のタスクが断続的に拒否されるという問題が発生していますqueueSize + maxPoolSize。 私が解決しようとしている問題はThreadPoolExecutor、スレッドプールのキューにある保留中の実行に基づいてコアスレッドのサイズを変更して拡張することです。デフォルトでThreadPoolExecutorはThread、キューがいっぱいの場合にのみ新しいが作成されるため、これが必要です。 これは、問題を示す小さな自己完結型のPure Java 8プログラムです。 import static java.lang.Math.max; import static java.lang.Math.min; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolResizeTest { public static void main(String[] args) throws Exception { // increase the number of iterations if unable to reproduce // for me …

1
反応ネイティブはマルチスレッドとバックグラウンドスレッドまたは並列実行をサポートしていますか?どうすればそれができますか?
私は、react-nativeやその他のメディアソース、ブログの公式ドキュメントを確認しましたが、react-nativeにはUIスレッドとJavaScriptスレッドがあることを知りました。Javascriptスレッドは、ロジックがJavaScriptコードを実行し、API呼び出しが行われ、タッチイベントが処理され、その他多くのスレッドです。また、UIスレッドはUIを更新します。 JavaScriptスレッドがプロセスで機能していて、ボタンアクションまたはその他のタッチイベントを再度実行した場合、1つのプロセスが完了した後、UIが更新されるのは、遅れているように感じるかどこかに行き詰まるまで続きます。 例えば 4つのタブがある下部のタブナビゲーターがあり、最初のタブにリストビューがあり、2番目のタブに複数のポイント間のルートを示すマップビューがあります。 最初のタブでいくつかのボタンアクション(リストビューのボタンのようにクリック)を実行し、すぐに2番目のタブに移動しました。UIの更新に少し遅れを感じたり、最初から移動するのに時間がかかる(1〜3秒)タブから2番目のタブ 2番目のタブでは、他のタブに移動すると、このプロセスが進行しているときに、マップが複数のポイント間のルートを取得するのに時間がかかり(5〜10秒)、タブ間のナビゲーションがスムーズでなく、UIラグがたくさんあります。 反応ネイティブアプリをタッチ可能なアクションにより速く応答させ、UIラグを減らすにはどうすればよいですか メインスレッドで特定のロジックを実行し、UIを更新して反応ネイティブアプリケーションを遅延なしで高速に応答させることができるマルチスレッドおよびバックグラウンドスレッドの概念はありますか?

4
cppreferenceでの緩和された順序付けの説明に誤りはありますか?
cppreference.comのドキュメントstd::memory_orderには、緩和された順序付けの例があります。 ゆるやかな注文 タグ付けさmemory_order_relaxedれたアトミック操作は同期操作ではありません。同時メモリアクセスに順序を課すことはありません。原子性と変更順序の一貫性のみが保証されます。 たとえば、xとyが最初はゼロの場合、 // Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D は、r1 == r2 == 42を生成することを許可されています。なぜなら、Aはスレッド1内でBの前にシーケンスされ、Cはスレッド2内でDの前にシーケンスされるからです。 xの変更順序でCの前に表示されます。yに対するDの副作用はスレッド1の負荷Aに見え、xに対するBの副作用はスレッド2の負荷Cに見える可能性があります。特に、これはDがCの前に完了する場合に発生する可能性があります。スレッド2、コンパイラの並べ替えまたは実行時のいずれかが原因。 「Cはスレッド2内でDの前にシーケンスされます」と書かれています。 評価順にあるsequenced-beforeの定義によれば、AがBの前にシーケンス化されている場合、Aの評価はBの評価が始まる前に完了します。Cはスレッド2内でDの前に順序付けられているため、Dが始まる前にCを完了する必要があるため、スナップショットの最後の文の条件部分は決して満たされません。

2
割り当てられたタスクの1つが何らかの理由で失敗すると、Javaはexecutorサービスを停止します
いくつかのタスクを同時に、1秒の間隔で1分間実行するある種のサービスが必要です。 タスクの1つが失敗した場合、サービスとそれとともに実行されたすべてのタスクを何らかの問題が発生したことを示すインジケーターで停止します。それ以外の場合は、1分後にすべてがうまくいった場合、サービスはすべて正常に終了したことを示すインジケーターで停止します。 たとえば、私は2つの機能があります: Runnable task1 = ()->{ int num = Math.rand(1,100); if (num < 5){ throw new Exception("something went wrong with this task,terminate"); } } Runnable task2 = ()->{ int num = Math.rand(1,100) return num < 50; } ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2); task1schedule = scheduledExecutorService.scheduleAtFixedRate(task1, 1, 60, TimeUnit.SECONDS); task2schedule = …

3
「揮発性」は、マルチコアシステムのポータブルCコードで何かを保証しますか?
見た後、束 の 他の 質問 と その 回答を、私はという印象を得るCで「揮発性」というキーワードが正確に何を意味するのかには広範な合意はありませんが。 標準自体でさえ、誰もがそれが何を意味するのかについて合意するのに十分明確ではないようです。 他の問題の中で: それはあなたのハードウェアとあなたのコンパイラに依存して異なる保証を提供するようです。 コンパイラの最適化には影響しますが、ハードウェアの最適化には影響しません。そのため、独自のランタイム最適化を行う高度なプロセッサでは、コンパイラが防止したい最適化を防止できるかどうかさえ明確ではありません。(一部のコンパイラーは、一部のシステムで一部のハードウェア最適化を防止するために命令を生成しますが、これは決して標準化されていないようです。) 問題を要約すると、「大量に読み取った後」「揮発性」が次のようなことを保証しているように見えます。値は、レジスタからだけでなく、少なくともコアのL1キャッシュにも、同じ順序で読み書きされます。読み取り/書き込みがコードに表示されます。しかし、これは役に立たないようです。レジスタからの読み取り/レジスタへの書き込みは同じスレッド内ですでに十分ですが、L1キャッシュとの調整は、他のスレッドとの調整に関してそれ以上何も保証しません。L1キャッシュとだけ同期することがいつ重要になるかは想像できません。 USE 1 揮発性の広く合意された使用は、ライトを(直接、ハードウェアで)制御するメモリ内のビットのように、特定のメモリ位置がI / O機能にハードウェアでマッピングされている古いシステムまたは組み込みシステムであるようです、またはキーボードのキーが押されているかどうかを通知するメモリ内のビット(ハードウェアによって直接キーに接続されているため)。 と思われる「利用1」とは、そのターゲットのマルチコアシステムを含んポータブルなコードでは発生しません。 USE 2 「use 1」とそれほど変わらないのは、割り込みハンドラー(ライトの制御やキーからの情報の保存など)によっていつでも読み書きできるメモリです。しかし、すでにこのため、システムによっては、割り込みハンドラが 独自のメモリキャッシュを備えた別のコアで実行される可能性があり、「揮発性」はすべてのシステムでキャッシュの一貫性を保証しないという問題があります。 したがって、「use 2」は「volatile」が提供できる範囲を超えているようです。 USE 3 他に議論の余地のない唯一の用途は、コンパイラーが認識しない同じメモリーを指している同じメモリーを指すさまざまな変数を介したアクセスの誤最適化を防ぐことです。しかし、人々がそれについて話していないので、これはおそらく議論の余地がないだけです-私はそれについての言及を1つだけ見ました。また、C標準では、「異なる」ポインター(関数への異なる引数など)が同じ項目または近くの項目を指す可能性があることをすでに認識しており、コンパイラーがそのような場合でも機能するコードを生成する必要があることをすでに指定しています。しかし、私はこのトピックを最新(500ページ)の標準ですぐに見つけることができませんでした。 では「use 3」はまったく存在しないのでしょうか。 したがって、私の質問: 「揮発性」は、マルチコアシステムのポータブルCコードで何かを保証しますか? 編集-更新 最新の標準を参照した後、答えは少なくとも非常に制限されているように見えます: 1.標準は、特定のタイプ "volatile sig_atomic_t"の特別な扱いを繰り返し指定しています。ただし、この規格では、マルチスレッドプログラムでシグナル関数を使用すると、未定義の動作が発生することも規定されています。したがって、この使用例は、シングルスレッドプログラムとそのシグナルハンドラ間の通信に限定されているようです。 2.この規格では、setjmp / longjmpに関連する「揮発性」の明確な意味も規定されています。(重要なコードの例は、他の質問と回答に記載されています。) したがって、より正確な質問は次のようになります 。「揮発性」は、(1)シングルスレッドプログラムがシグナルハンドラから情報を受信できるようにする、または(2)setjmpを許可することを除いて、マルチコアシステムのポータブルCコードで何でも保証しますかsetjmpとlongjmpの間で変更された変数を表示するコード? これははい/いいえの質問です。 「はい」の場合、「揮発性」が省略された場合にバグになるバグのないポータブルコードの例を示すことができればすばらしいでしょう。「いいえ」の場合、マルチコアターゲットの場合、これら2つの非常に特殊なケース以外では、コンパイラーは「揮発性」を無視してもかまいません。

1
C ++ 17並列 `for_each`のスレッド数を制限することは可能ですか?
私はstd::for_eachwith を使用しstd::execution::parて、構造のベクトルとして表される巨大な入力に対して複雑な計算を実行します。計算には、ハードウェア(ネットワークやディスクIOなど)に関連する遅延は必要ありません。これは「単なるCPU」計算です。私にとっては、ハードウェアスレッドのようにOSスレッドを増やす必要はないのは当然のことです。ただし、Visual C ++ 2019では、平均50スレッドが作成され、ハードウェアスレッドが12しかない場合でも最大500スレッド作成されることがあります。 並列スレッドを制限するが方法はにカウントされhardware_concurrencyてstd::for_eachおよびstd::execution::par、またはカウント合理的なスレッドを作成するための唯一の方法はでカスタムコードを使用することですかstd::thread?

2
WebViewがsnapshot()の準備ができるのはいつですか?
JavaFXのドキュメント状態WebView時に準備ができているWorker.State.SUCCEEDEDに達しているしばらくの間(すなわち待たない限り、しかしAnimation、Transition、PauseTransition、など)を、空白のページが表示されます。 これは、キャプチャの準備ができているWebView内で発生するイベントがあることを示唆していますが、それは何ですか? あります7,000以上のコードスニペットは、GitHubの上でその使用SwingFXUtils.fromFXImageが、それらのほとんどがどちらかに無関係と思われるWebView、インタラクティブ(ヒトマスクは競合状態)であるか、(100ミリ秒から2,000msまでの任意の場所)任意のトランジションを使用しています。 私はもう試した: の寸法changed(...)内からリッスンしますWebView(高さと幅のプロパティDoublePropertyはObservableValue、これらのものを監視できます) 🚫実行できません。場合によっては、値がペイントルーチンとは別に変化して、部分的なコンテンツになることがあります。 runLater(...)FXアプリケーションスレッドで何でもすべてを盲目的に伝える。 techniques多くの手法でこれを使用していますが、私自身の単体テスト(および他の開発者からの素晴らしいフィードバック)は、イベントがすでに正しいスレッドにあることが多く、この呼び出しは冗長であることを説明しています。私が考えることができる最高のものは、それがいくつかのために働くキューイングを通しての遅延のちょうど十分な追加です。 DOMリスナー/トリガーまたはJavaScriptリスナー/トリガーを WebView SUCCEEDED空白のキャプチャにもかかわらず、が呼び出されると、JavaScriptとDOMの両方が正しく読み込まれているようです。DOM / JavaScriptリスナーは役に立たないようです。 AnimationまたはTransitionを使用して、メインFXスレッドをブロックせずに効果的に「スリープ」します。 ⚠️このアプローチは機能し、遅延が十分に長い場合、ユニットテストの最大100%を生み出すことができますが、遷移時間は、私たちが推測していて設計が悪い将来の瞬間のようです。パフォーマンスの高いアプリケーションやミッションクリティカルなアプリケーションの場合、これはプログラマーにスピードと信頼性のどちらかをトレードオフすることを強制します。 いつ電話するのがいいWebView.snapshot(...)ですか? 使用法: SnapshotRaceCondition.initialize(); BufferedImage bufferedImage = SnapshotRaceCondition.capture("<html style='background-color: red;'><h1>TEST</h1></html>"); /** * Notes: * - The color is to observe the otherwise non-obvious cropping that occurs * with some techniques, such as `setPrefWidth`, `autosize`, etc. * …

1
起動後にspawn子プロセスを切り離します
このようにして、スポーン子プロセスを開始します。 let process = spawn(apiPath, { detached: true }) process.unref() process.stdout.on('data', data => { /* do something */ }) プロセスを開始するとき、その出力を読みたいので、プロセスをアタッチしたままにする必要があります。しかし、Nodeプロセス(親)を閉じる直前に、完了していないすべての子プロセスを切り離して、バックグラウンドで実行したままにしておきたいのですが、ドキュメントでは次のように述べています。 detachedオプションを使用して長時間実行プロセスを開始する場合、親に接続されていないstdio構成が提供されていない限り、親の終了後、プロセスはバックグラウンドで実行されたままにはなりません。 しかし、オプションstdio: 'ignore'を使用stdoutすると、問題を読み取ることができません。 親プロセスを閉じる前に手動でパイプを閉じようとしましたが、失敗しました: // Trigger just before the main process end process.stdin.end() process.stderr.unpipe() process.stdout.unpipe()

5
リクエストアイテムごとに複数のスレッドを作成する方法
注文レベルでマルチスレッドを使用して以下のコードを処理しようとしています。 List<String> orders = Arrays.asList("order1", "order2", "order3", "order4", "order1"); 現在の順次実行: orders.stream().forEach(order -> { rules.forEach(rule -> { finalList.add(beanMapper.getBean(rule) .applyRule(createTemplate.apply(getMetaData.apply(rule), command), order)); }); }); 私は使ってみました: orders.parallelStream().forEach(order -> {}} // code snippet. しかし、rules.forEach(rule-> {}}の順序を変更しています。 例: 入力: List<String> orders = Arrays.asList("order1", "order2", "order3", "order4", "order1"); List<String> rules = Arrays.asList("rule1", "rule2", "rule3"); 期待される出力: order1 with …

1
「前に強く起こる」とはどういう意味ですか?
C ++ドラフト標準では、「前に強く起こる」というフレーズが何度か使用されています。 例:終了 [basic.start.term] / 5 std :: atexitへの呼び出し([support.start.term]を参照)の前に、静的ストレージ期間を持つオブジェクトの初期化が強く発生した場合、std :: atexitに渡された関数の呼び出しオブジェクトのデストラクタを呼び出す前にシーケンス化されます。std :: atexitの呼び出しが静的ストレージ期間のオブジェクトの初期化が完了する前に強く発生する場合、オブジェクトのデストラクタの呼び出しは、std :: atexitに渡される関数の呼び出しの前にシーケンスされます。std :: atexitへの呼び出しがstd :: atexitへの別の呼び出しの前に強く発生する場合、2番目のstd :: atexit呼び出しに渡される関数の呼び出しは、関数に渡される前にシーケンスされます最初のstd :: atexit呼び出し。 データレース [intro.races] / 12で定義 評価Aは、評価Dの前に強く発生します。 (12.1)AがDの前にシーケンスされる、または (12.2)AがDと同期し、AとDの両方が順次一貫したアトミック操作([atomics.order])である、または (12.3)評価BとCがあり、AはBの前にシーケンスされ、Bは単にCの前に発生し、CはDの前にシーケンスされる、または (12.4)AがBの前に強く発生し、BがDの前に強く発生するという評価Bがあります。 [注:非公式に、AがBの前に強く発生する場合、AはすべてのコンテキストでBの前に評価されるように見えます。excludeが操作を消費する前に強く発生します。—エンドノート] なぜ「以前に強く起こる」ことが導入されたのですか?直感的に、その違いと「以前の出来事」との関係は何ですか? ノートの「AはすべてのコンテキストでBより先に評価されるように見える」とはどういう意味ですか? (注:この質問の動機は、この回答の下でのPeter Cordesのコメントです。) 追加の標準草案(Peter Cordesに感謝) 順序と一貫性 [atomics.order] / 4 すべてのmemory_order :: seq_cst操作(フェンスを含む)には、次の制約を満たす単一の合計順序Sがあります。まず、AとBがmemory_order :: seq_cst操作で、AがBの前に強く発生する場合、AはSでBの前に発生します。 Bの前に、Sが満たすには、次の4つの条件が必要です。 (4.1)AとBが両方ともmemory_order …


1
別のスレッドからフラッターエンジンメソッドを呼び出す方法
Linuxのフラッターデスクトップを使用しています。MarkTextureFrameAvailableエンジンによって再レンダリングされるテクスチャをマークすることになっていると呼ばれるメソッドを呼び出しています。私はビデオプレーヤーをプログラミングしているのでMarkTextureFrameAvailable、プレーヤーのスレッドから呼び出す必要があります。問題は、エンジンがエンジンMarkTextureFrameAvailableを作成したスレッドから(およびその他のエンジンメソッドを)呼び出すように強制することです。 エンジンへのすべての呼び出しは、呼び出しが作成されたのと同じスレッドから行われているかどうかを常に確認するシェルで終了することがわかります。 task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread() (https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838) これは、フラッターエンジンを作成する方法です。 int main(int argc, char **argv) { //.. flutter::FlutterWindowController flutter_controller(icu_data_path); // Start the engine. if (!flutter_controller.CreateWindow(800, 600, "Flutter WebRTC Demo", assets_path, arguments)) { return EXIT_FAILURE; } // Register any native plugins. FlutterWebRTCPluginRegisterWithRegistrar( flutter_controller.GetRegistrarForPlugin("FlutterWebRTCPlugin")); // Run until the window is closed. flutter_controller.RunEventLoop(); return EXIT_SUCCESS; } ご覧のとおり、エンジンを作成するスレッドはブロックされます。flutter_controller.RunEventLoop();これは、メインのスレッドから強制的に実行されるイベントディスパッチャーを配置できる唯一の場所です。私はこの考えが好きではありません。RunEventLoopWithTimeout存在していても、タイムアウトを設定し、MarkTextureFrameAvailable呼び出しのキューにチェックインし続ける必要があります。これは最適ではないと思います。 ではMarkTextureFrameAvailable、メインスレッドからどのように呼び出す必要がありますか? …

3
list :: empty()マルチスレッドの動作?
さまざまなスレッドが要素を取得するためのリストがあります。リストが空のときに保護しているmutexをロックしないようにするために、ロックするempty()前にチェックします。 呼び出しがlist::empty()100%正しくない場合でも問題ありません。同時list::push()およびlist::pop()コールのクラッシュまたは中断を回避したいだけです。 私はVC ++とGnu GCCが時々empty()間違って、何も悪いことはないと思い込んでも大丈夫ですか? if(list.empty() == false){ // unprotected by mutex, okay if incorrect sometimes mutex.lock(); if(list.empty() == false){ // check again while locked to be certain element = list.back(); list.pop_back(); } mutex.unlock(); }

1
Haskellの計算負荷の高いスレッドが他のすべてのスレッドをブロックする
メインスレッドが計算のために新しいスレッドをフォークし、一定の期間終了するのを待つプログラムを作成したいと思います。子スレッドが所定の時間内に完了しない場合、タイムアウトして強制終了されます。これには次のコードがあります。 import Control.Concurrent fibs :: Int -> Int fibs 0 = 0 fibs 1 = 1 fibs n = fibs (n-1) + fibs (n-2) main = do mvar <- newEmptyMVar tid <- forkIO $ do threadDelay (1 * 1000 * 1000) putMVar mvar Nothing tid' <- forkIO $ do if …

1
アトミックタイプのベクトルを割り当てる方法は?
どうすれば、原子の型を持つベクトルのメンバーを割り当てることができますか? #include <iostream> #include <thread> #include <vector> using namespace std; int main() { vector<atomic<bool>> myvector; int N=8; myvector.assign(N,false); cout<<"done!"<<endl; } https://wandbox.org/permlink/lchfOvqyL3YKNivk prog.cc: In function 'int main()': prog.cc:11:28: error: no matching function for call to 'std::vector<std::atomic<bool> >::assign(int&, bool)' 11 | myvector.assign(N,false); | ^

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