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

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

5
C ++ 11のstd :: atomic :: compare_exchange_weak()を理解する
bool compare_exchange_weak (T& expected, T val, ..); compare_exchange_weak()C ++ 11で提供される比較交換プリミティブの1つです。それはだ、弱いオブジェクトの値が等しい場合、それは偽さえを返すという意味でexpected。これは、(x86のように1つではなく)一連の命令を使用して実装する一部のプラットフォームでの誤った障害が原因です。このようなプラットフォームでは、コンテキストスイッチ、別のスレッドによる同じアドレス(またはキャッシュライン)のリロードなどにより、プリミティブが失敗する可能性があります。それはだspurious、それが(等しくないオブジェクトの値ではありませんようexpected、操作を失敗しました)。代わりに、それは一種のタイミングの問題です。 しかし、私を困惑させるのは、C ++ 11標準(ISO / IEC 14882)で言われていることです。 29.6.5 ..疑似障害の結果、弱いコンペアアンドスワップのほぼすべての使用がループになります。 ほぼすべての用途でループする必要があるのはなぜですか?それは、誤った失敗のために失敗したときにループすることを意味しますか?もしそうなら、なぜcompare_exchange_weak()私たちは自分たちでループを使用して書くのですか?私たちはcompare_exchange_strong()、私たちのために偽の失敗を取り除くべきだと私が思うものを使うことができます。の一般的な使用例はcompare_exchange_weak()何ですか? 関連する別の質問。彼の著書「C ++ Concurrency In Action」の中で、Anthonyは次のように述べています。 //Because compare_exchange_weak() can fail spuriously, it must typically //be used in a loop: bool expected=false; extern atomic<bool> b; // set somewhere else while(!b.compare_exchange_weak(expected,true) && !expected); //In …

5
LinuxのGCCでstd :: threadを使用するための正しいリンクオプションは何ですか?
こんにちは私はstd::threadG ++で使用しようとしています。これが私のテストコードです #include <thread> #include <iostream> int main(int, char **){ std::thread tt([](){ std::cout<<"Thread!"<<std::endl; }); tt.join(); } コンパイルされますが、実行しようとすると次のようになります。 terminate called after throwing an instance of 'std::system_error' what(): Operation not permitted Aborted 私のコンパイラバージョン: $ g++ --version g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see …


8
そうでない場合、誰がJavaスレッドのinterrupt()メソッドを呼び出していますか?
Java Concurrency in Practiceを読んだり、読み直したり、このテーマに関するいくつかのスレッドを読んだり、IBMの記事「InterruptedExceptionに対処する」を読んだりしましたが、理解できないことがあり、壊れている可能性があります。 2つの質問に分けてください: 自分で他のスレッドを中断したことがない場合、InterruptedExceptionをトリガーできるのは何ですか? 自分でinterrupt()を使用して他のスレッドを中断したことがない場合(たとえば、ポイズンピルやwhile(!cancelled)スタイルループ[両方ともJCIPで説明されている]など、作業中のスレッドをキャンセルするために他の手段を使用しているため)、それでは、InterruptedExceptionはどういう意味ですか?捕まえたらどうすればいいの?アプリをシャットダウンしますか?

6
ThreadLocal変数のパフォーマンス
ThreadLocal通常のフィールドよりも遅い変数からの読み取りはどれくらいですか? より具体的には、単純なオブジェクトの作成は、ThreadLocal変数へのアクセスよりも速いですか、遅いですか? 私はそれが十分に速いので、ThreadLocal<MessageDigest>インスタンスを持つことはMessageDigest毎回のインスタンスを作成するよりもはるかに速いと思います。しかし、それはたとえばバイト[10]やバイト[1000]にも当てはまりますか? 編集:質問は、ThreadLocal's getを呼び出すときに実際に何が起こっているのですか?それが他の分野と同じように単なる分野である場合、答えは「常に最速」ですよね?

6
ロックされたオブジェクトは、その内部で例外が発生した場合、ロックされたままになりますか?
ac#スレッドアプリで、オブジェクトをロックする場合、キューとしましょう。例外が発生した場合、オブジェクトはロックされたままになりますか?疑似コードは次のとおりです。 int ii; lock(MyQueue) { MyClass LclClass = (MyClass)MyQueue.Dequeue(); try { ii = int.parse(LclClass.SomeString); } catch { MessageBox.Show("Error parsing string"); } } 私が理解しているように、catchの後のコードは実行されませんが、ロックが解放されるかどうか疑問に思っていました。

6
ロックフリーマルチスレッディングは、実際のスレッディングの専門家向けです
私はジョン・スキートが質問に与えた答えを読んでいて、その中で彼はこれに言及しました: 私に関する限り、ロックフリーマルチスレッドは実際のスレッドの専門家向けであり、私はその専門家ではありません。 これを聞いたのは初めてではありませんが、ロックフリーのマルチスレッドコードの記述方法を学ぶことに興味がある場合、実際にどのように行うかについて話している人はほとんどいません。 だから私の質問は、スレッド化などについてあなたができるすべてを学ぶことに加えて、ロックフリーのマルチスレッドコードを具体的に書くことをどこから学び始めますか、そしていくつかの良いリソースは何ですか? 乾杯

2
armadillosolve()スレッドは安全ですか?
私のコードには、線形システムを構築して過剰決定し、それを解こうとするループがあります。 #pragma omp parallel for for (int i = 0; i < n[0]+1; i++) { for (int j = 0; j < n[1]+1; j++) { for (int k = 0; k < n[2]+1; k++) { arma::mat A(max_points, 2); arma::mat y(max_points, 1); // initialize A and y arma::vec solution = solve(A,y); …


6
Javaでのオブジェクトのモニターの意味は何ですか?なぜこの言葉を使うのですか?
Javaスレッドに関する記事を読んでいると、「現在のスレッドはこのオブジェクトのモニターの所有者です」という表現に気付くことがよくあります。私は意味を理解します:スレッドはオブジェクトを操作する権利を取得します。しかし、なぜ「オブジェクトのロック」の代わりに「オブジェクトのモニター」というフレーズを使用するのか、私は困惑していますか? 簡単に言えば、「モニター」という言葉の意味がわかりません。質問は奇妙で単純かもしれません。しかし、私は誰もがそれを解決するのを手伝ってくれることを願っています。3ks

4
Javaスレッドガベージが収集されたかどうか
この質問はいくつかのサイトに投稿されました。正しい答えが見つからなかったので、ここにもう一度投稿します。 public class TestThread { public static void main(String[] s) { // anonymous class extends Thread Thread t = new Thread() { public void run() { // infinite loop while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { } // as long as this line printed out, you …

10
C#スレッドの終了とThread.Abort()
MSDNでは、Thread.Abort()メソッドの説明に次のように記載されています。「このメソッドを呼び出すと、通常はスレッドが終了します。」 なぜいつもではないのですか? どちらの場合、スレッドは終了しませんか? スレッドを終了する他の可能性はありますか?

13
C ++のvolatileキーワードはメモリフェンスを導入しますか?
volatile値が変更される可能性があることをコンパイラに通知することを理解していますが、この機能を実現するために、コンパイラはそれを機能させるためにメモリフェンスを導入する必要がありますか? 私の理解では、揮発性オブジェクトに対する一連の操作は並べ替えることができず、保持する必要があります。これは、いくつかのメモリフェンスが必要であり、これを回避する方法が実際にはないことを意味しているようです。私はこれを言うのは正しいですか? この関連する質問で興味深い議論があります ジョナサンウェイクリーは書いています: ...個別の揮発性変数へのアクセスは、それらが別々の完全な式で発生する限り、コンパイラーによって並べ替えることはできません...揮発性はスレッドセーフには役に立たないが、彼が与える理由ではありません。これは、コンパイラが揮発性オブジェクトへのアクセスを並べ替える可能性があるためではなく、CPUがそれらを並べ替える可能性があるためです。アトミック操作とメモリバリアにより、コンパイラとCPUの並べ替えが妨げられます これにデビッド・シュワルツ氏は返信コメントで: ... C ++標準の観点からは、コンパイラが何かを実行することと、コンパイラがハードウェアに何かを実行させる命令を発行することとの間に違いはありません。CPUが揮発性物質へのアクセスを並べ替える可能性がある場合、標準ではそれらの順序を保持する必要はありません。..。 ... C ++標準では、並べ替えの内容を区別していません。そして、CPUが観察可能な影響なしにそれらを並べ替えることができると主張することはできないので、それは問題ありません-C ++標準はそれらの順序を観察可能として定義しています。コンパイラーは、プラットフォームに標準が要求することを実行させるコードを生成する場合、プラットフォーム上のC ++標準に準拠しています。標準が揮発性物質へのアクセスを並べ替えないことを要求している場合、プラットフォームは揮発性物質を並べ替えることに準拠していません。..。 私のポイントは、C ++標準がコンパイラーによる個別の揮発性物質へのアクセスの並べ替えを禁止している場合、そのようなアクセスの順序はプログラムの観察可能な動作の一部であるという理論に基づいて、CPUが実行することを禁止するコードを発行することもコンパイラーに要求するということです。そう。この規格は、コンパイラーが行うことと、コンパイラーの生成コードがCPUに行うことを区別していません。 どちらが2つの質問をもたらします:どちらかが「正しい」ですか?実際の実装は実際に何をしますか?


10
スレッドを使用してIISで長時間実行されるジョブを実行できますか?
ASP.Netアプリケーションでは、ユーザーがWebページのボタンをクリックすると、イベントハンドラーを介してサーバー上のオブジェクトがインスタンス化され、オブジェクトのメソッドが呼び出されます。メソッドは外部システムに移動して処理を実行しますが、これにはしばらく時間がかかる場合があります。したがって、私がやりたいのは、そのメソッド呼び出しを別のスレッドで実行して、「リクエストが送信されました」というメッセージでユーザーに制御を戻すことができるようにすることです。ユーザーがオブジェクトのステータスをポーリングし続けることができればさらに良いでしょうが、私はこれをファイアアンドフォーゲットとして行うことをかなり嬉しく思います。 私が知らないのは、ユーザーセッションが期限切れになっても、IISがスレッドの実行を継続できるかどうかです。ユーザーがイベントを起動し、サーバー上でオブジェクトをインスタンス化し、新しいスレッドでメソッドを起動するとします。ユーザーは「リクエストが送信されました」というメッセージに満足し、ブラウザを閉じます。最終的に、このユーザーセッションはIISでタイムアウトしますが、スレッドはまだ実行中であり、作業を行っている可能性があります。IISはスレッドの実行を継続できるようにしますか、それともユーザーセッションの期限が切れるとスレッドを強制終了してオブジェクトを破棄しますか? 編集:回答とコメントから、これを行う最善の方法は、実行時間の長い処理をIISの外部に移動することであると理解しています。他のすべてとは別に、これはappdomainリサイクルの問題を扱います。実際には、限られた時間でバージョン1をリリースする必要があり、既存のフレームワーク内で作業する必要があるため、サービスレイヤーを避けたいため、IIS内のスレッドを起動するだけで済みます。実際には、ここでの「長時間実行」は数分で、Webサイトの同時実行性は低くなるため、問題ないはずです。ただし、次のバージョンでは、別のサービスレイヤーに分割する必要があります。

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