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

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


15
'using'ステートメントvs'tryfinally '
読み取り/書き込みロックを使用するプロパティがたくさんあります。try finallyまたはusing句を使用して実装できます。 で、のtry finally前にロックを取得しtry、で解放しますfinally。このusing句では、コンストラクターでロックを取得し、Disposeメソッドで解放するクラスを作成します。 私は多くの場所で読み取り/書き込みロックを使用しているので、より簡潔な方法を探していました try finally。なぜある方法が推奨されないのか、またはある方法が別の方法よりも優れているのかについて、いくつかのアイデアを聞くことに興味があります。 方法1(try finally): static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock(); private DateTime dtMyDateTime_m public DateTime MyDateTime { get { rwlMyLock_m .AcquireReaderLock(0); try { return dtMyDateTime_m } finally { rwlMyLock_m .ReleaseReaderLock(); } } set { rwlMyLock_m .AcquireWriterLock(0); try { dtMyDateTime_m = value; } finally { rwlMyLock_m …

4
Dispatcher.Invokeを使用して、非メインスレッドからWPFコントロールを変更します
最近、WPFでプログラミングを開始し、次の問題に遭遇しました。使い方がわかりませんDispatcher.Invoke()。私はスレッド化の経験があり、使用したばかりのいくつかの簡単なWindowsフォームプログラムを作成しました。 Control.CheckForIllegalCrossThreadCalls = false; はい、私はそれがかなり不十分であることを知っていますが、これらは単純な監視アプリケーションでした。 実際には、バックグラウンドでデータを取得するWPFアプリケーションを作成しています。新しいスレッドを開始して、(Webサーバーから)データを取得するための呼び出しを行います。次に、WPFフォームに表示します。問題は、このスレッドからコントロールを設定できないということです。ラベルも何もありません。これはどのように解決できますか? コメントへの回答: @Jalfp: データを取得するときに、「新しいトレッド」でこのDispatcherメソッドを使用しますか?または、バックグラウンドワーカーにデータを取得させ、フィールドに配置して、このフィールドが入力されるまで待機する新しいスレッドを開始し、ディスパッチャーを呼び出して、取得したデータをコントロールに表示する必要がありますか?

6
NSOperationおよびNSOperationQueue作業スレッドとメインスレッド
アプリで一連のダウンロードおよびデータベース書き込み操作を実行する必要があります。私が使用していますNSOperationとNSOperationQueue同じため。 これはアプリケーションシナリオです。 場所からすべての郵便番号を取得します。 郵便番号ごとに、すべての家を取得します。 家ごとに住民の詳細を取得します すでに述べたように、NSOperationタスクごとにを定義しました。最初のケース(タスク1)では、すべての郵便番号を取得するようにサーバーにリクエストを送信しています。内の代理人NSOperationがデータを受け取ります。次に、このデータはデータベースに書き込まれます。データベース操作は別のクラスで定義されています。からNSOperationクラス、データベースクラスで定義された書き込み関数を呼び出しています。 私の質問は、データベースの書き込み操作がメインスレッドで発生するのか、バックグラウンドスレッドで発生するのかということです。内で呼び出してNSOperationいたので、 とは別のスレッド(MainThreadではない)で実行されることを期待していましたNSOperation。対処しながら、誰かがこのシナリオを説明していただけますNSOperationとNSOperationQueue。

15
C ++はintAtomicの読み取りと書き込みですか?
2つのスレッドがあります。1つはintを更新し、もう1つはそれを読み取ります。これは、読み取りと書き込みの順序が関係ない統計値です。 私の質問は、とにかくこのマルチバイト値へのアクセスを同期する必要がありますか?または、別の言い方をすれば、書き込みの一部が完了して中断され、その後読み取りが発生する可能性があります。 たとえば、0x00010000の増分値を取得する値= 0x0000FFFFについて考えてみます。 気になる値が0x0001FFFFのようになる時間はありますか?確かに、タイプが大きいほど、このようなことが起こる可能性が高くなります。 私は常にこれらのタイプのアクセスを同期してきましたが、コミュニティの考えに興味がありました。

2
ArrayBlockingQueueで、最終メンバーフィールドをローカルの最終変数にコピーするのはなぜですか?
ではArrayBlockingQueue、ロックを必要とするすべてのメソッドは、をfinal呼び出す前にロックをローカル変数にコピーしますlock()。 public boolean offer(E e) { if (e == null) throw new NullPointerException(); final ReentrantLock lock = this.lock; lock.lock(); try { if (count == items.length) return false; else { insert(e); return true; } } finally { lock.unlock(); } } フィールドがであるときにthis.lockローカル変数lockにコピーする理由はありますか?this.lockfinal さらに、E[]アクションを実行する前にのローカルコピーも使用します。 private E extract() { final E[] items = this.items; …


3
マルチスレッド化プログラムは最適化モードのままですが、-O0で正常に実行されます
簡単なマルチスレッドプログラムを次のように記述しました。 static bool finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result=std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished=true; std::cout<<"result ="<<result.get(); std::cout<<"\nmain thread id="<<std::this_thread::get_id()<<std::endl; } それはでデバッグモードで正常に動作するVisual Studioのか-O0にGC Cとした後、結果をプリントアウト1秒。しかし、スタックモードになり、リリースモードまたはで何も印刷しません-O1 -O2 -O3。

4
forkを呼び出すときにスレッドはコピーされますか?
スレッドで実行しているプログラムがありfork()、UNIXベースのシステムを呼び出す場合、スレッドはコピーされますか?現在のプロセスの仮想メモリが、生成された新しいプロセスに1:1でコピーされることを知っています。スレッドがプロセスの仮想メモリに独自のスタックを持っていることを知っています。したがって、少なくともスレッドのスタックもコピーする必要があります。ただし、仮想メモリに存在しないためにコピーされないスレッドが他にあるかどうかはわかりません。ない場合、2つのプロセスはスレッドを共有していますか、それとも独立したコピーですか?

7
Java 8でブロッキングバックグラウンドローダーを作成する方法
質問 Java 8で適切なバックグラウンドローダーをどのように作成しますか?状況、契約条項: データはバックグラウンドでロードする必要があります ロード後、データが表示されます データがロードされている間、それ以上のリクエストは受け入れられません データのロード中にリクエストがあった場合、一定のタイムアウト(5秒など)後に別のロードをスケジュールする必要があります。 目的は、たとえばリロード要求を受け入れさせることですが、データベースが要求であふれることはありません。 MCVE これがMCVEです。これは、Thread.sleepを2秒間呼び出すだけでロードをシミュレートするバックグラウンドタスクで構成されています。タスクは毎秒スケジュールされるため、当然、バックグラウンドロードタスクの重複につながりますが、これは避けてください。 public class LoadInBackgroundExample { /** * A simple background task which should perform the data loading operation. In this minimal example it simply invokes Thread.sleep */ public static class BackgroundTask implements Runnable { private int id; public BackgroundTask(int id) { …

1
スレッドの生成はそれ自体でメモリ順序の保証を提供しますか?
私はこれを大まかにしたいです: 初期スレッド: 一部の値をグローバル変数に書き込みます(それらは二度と書き込まれません) これは、適度に大きなデータ(配列、文字列など)になる可能性があります。簡単には作れませんstd::atomic<>。 他のスレッドを生成する その他のスレッド: グローバル状態を読み取る 仕事などをする これで、引数をstd::threadに渡すことができることがわかりましたが、この例を通してC ++のメモリ保証を理解しようとしています。 また、実際の実装では、スレッドを作成するとメモリバリアが発生し、その時点までに親スレッドが書き込んだすべてをスレッドが「確認」できることを確信しています。 しかし私の質問は、これは規格によって保証されていますか? 余談:ダミーstd::atomic<int>などを追加して、他のスレッドを開始する前にそこに書き込んでから、他のスレッドで起動時に一度読み取ることができると思います。発生前のすべてのメカニズムにより、以前に作成されたグローバルな状態が適切に表示されることが保証されます。 しかし、私の質問は、そのようなものが技術的に必要かどうか、またはスレッドの作成で十分かどうかです。

3
forループ内のc ++スレッドが誤った値を出力する
私はc ++でマルチスレッドを理解しようとしていますが、この問題で立ち往生しています:forループでスレッドを起動すると、誤った値が出力されます。これはコードです: #include <iostream> #include <list> #include <thread> void print_id(int id){ printf("Hello from thread %d\n", id); } int main() { int n=5; std::list<std::thread> threads={}; for(int i=0; i<n; i++ ){ threads.emplace_back(std::thread([&](){ print_id(i); })); } for(auto& t: threads){ t.join(); } return 0; } 値0、1、2、3、4が出力されることを期待していましたが、同じ値を2回取得することがよくありました。これは出力です: Hello from thread 2 Hello from thread 3 …

4
WindowsでのマルチスレッドJavaアプリケーションのCPU使用率が低すぎる
私は、数値最適化問題のクラスを解決するためのJavaアプリケーションに取り組んでいます-より正確に言うと、大規模線形計画問題です。単一の問題は、並列に解決できる小さなサブ問題に分割できます。CPUコアよりも多くのサブ問題があるため、ExecutorServiceを使用して、各サブ問題を、ExecutorServiceに送信されるCallableとして定義します。サブ問題を解決するには、ネイティブライブラリ(この場合は線形計画法ソルバー)を呼び出す必要があります。 問題 最大44の物理コアと最大256gのメモリを備えたUnixおよびWindowsシステムでアプリケーションを実行できますが、大きな問題の場合、Windowsでの計算時間はLinuxでの計算時間よりも桁違いに長くなります。Windowsはかなり多くのメモリを必要とするだけでなく、時間の経過に伴うCPU使用率は最初の25%から数時間後には5%に低下します。Windowsのタスクマネージャのスクリーンショットは次のとおりです。 観察 問題全体の大規模なインスタンスの解決時間は数時間から数日の範囲で、最大32gのメモリを消費します(UNIXの場合)。副問題の解決時間はmsの範囲です。 この問題は、数分で解決できる小さな問題では発生しません。 Linuxはそのままの状態で両方のソケットを使用しますが、Windowsは、アプリケーションが両方のコアを利用するように、BIOSでメモリインターリービングを明示的にアクティブにする必要があります。ただし、これを行うかどうかは、時間の経過に伴う全体的なCPU使用率の低下には影響しません。 VisualVMのスレッドを見ると、すべてのプールスレッドが実行されていますが、待機中のものはありません。 VisualVMによると、90%のCPU時間はネイティブ関数呼び出しに費やされています(小さな線形プログラムを解く) アプリケーションは多くのオブジェクトを作成および逆参照しないため、ガベージコレクションは問題になりません。また、ほとんどのメモリはオフヒープに割り当てられているようです。最大のインスタンスでは、Linuxでは4g、Windowsでは8gのヒープで十分です。 私が試したこと あらゆる種類のJVM引数、高XMS、高メタスペース、UseNUMAフラグ、その他のGC。 異なるJVM(ホットスポット8、9、10、11)。 さまざまな線形計画ソルバーのさまざまなネイティブライブラリ(CLP、Xpress、Cplex、Gurobi)。 ご質問 ネイティブコールを多用する大規模なマルチスレッドJavaアプリケーションのLinuxとWindowsのパフォーマンスの違いは何が原因ですか? たとえば、Windowsに役立つ実装で変更できるものはありますか。たとえば、何千ものCallableを受け取るExecutorServiceの使用を避け、代わりに何をすべきでしょうか?

2
関数オブジェクトを使用するC ++スレッド、複数のデストラクタはどのように呼び出されますが、コンストラクタは呼び出されないのですか?
以下のコードスニペットを見つけてください。 class tFunc{ int x; public: tFunc(){ cout<<"Constructed : "<<this<<endl; x = 1; } ~tFunc(){ cout<<"Destroyed : "<<this<<endl; } void operator()(){ x += 10; cout<<"Thread running at : "<<x<<endl; } int getX(){ return x; } }; int main() { tFunc t; thread t1(t); if(t1.joinable()) { cout<<"Thread is joining..."<<endl; t1.join(); } …

2
Julia(1.3)のフィボナッチ数列でのマルチスレッド並列処理パフォーマンスの問題
私はJulia 1.3次のハードウェアでマルチスレッド機能を試しています: Model Name: MacBook Pro Processor Name: Intel Core i7 Processor Speed: 2.8 GHz Number of Processors: 1 Total Number of Cores: 4 L2 Cache (per Core): 256 KB L3 Cache: 6 MB Hyper-Threading Technology: Enabled Memory: 16 GB 次のスクリプトを実行すると: function F(n) if n < 2 return n else …

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