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

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

3
Pythonの辞書のスレッドセーフ
辞書を持っているクラスがあります class OrderBook: orders = {'Restaurant1': None, 'Restaurant2': None, 'Restaurant3': None, 'Restaurant4': None} @staticmethod def addOrder(restaurant_name, orders): OrderBook.orders[restaurant_name] = orders そして、私はメソッドを呼び出す4つのスレッド(各レストランに1つ)を実行していますOrderBook.addOrder。次に、各スレッドによって実行される関数を示します。 def addOrders(restaurant_name): #creates orders ... OrderBook.addOrder(restaurant_name, orders) これは安全ですか、または呼び出す前にロックを使用する必要がありますaddOrderか?

3
STAThreadとマルチスレッド
STAThreadに関するMSDNの記事から: アプリケーションのCOMスレッドモデルがシングルスレッドアパートメント(STA)であることを示します。 (参考までに、それが記事全体です。) シングルスレッドのアパート... OK、それは私の頭を超えました。また、アプリケーションがCOM相互運用機能を使用しない限り、この属性は実際には何もしないことをどこかで読みました。では、それは正確には何をするのでしょうか。また、マルチスレッドアプリケーションにどのような影響を与えるのでしょうか。マルチスレッドアプリケーション(スレッドTimerプールなどだけでなく、sを使用して非同期メソッドの呼び出しを行うものも含む)は、「安全のため」にMTAThreadを使用する必要がありますか?STAThreadとMTAThreadは実際には何をしますか?
102 c#  .net  multithreading  sta 

3
.classのJava同期ブロック
このJavaコードはどういう意味ですか?それはのすべてのオブジェクトをロックしますMyClassか? synchronized(MyClass.class) { //is all objects of MyClass are thread-safe now ?? } そして、上記のコードがこれとどのように異なるか: synchronized(this) { //is all objects of MyClass are thread-safe now ?? }

4
スレッドの作成-Task.Factory.StartNew vs new Thread()
.Net 4の新しいスレッドおよび並列ライブラリについて学んでいるところです。 以前は、次のようにして(例として)新しいスレッドを作成しました。 DataInThread = new Thread(new ThreadStart(ThreadProcedure)); DataInThread.IsBackground = true; DataInThread.Start(); 今私はできる: Task t = Task.Factory.StartNew(() => { ThreadProcedure(); }); どんな違いがありますか? ありがとう


7
Java ThreadLocal変数が静的である必要がある理由
ここでThreadlocalのJavaDocを読んでいました https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ThreadLocal.html また、「ThreadLocalインスタンスは、通常、状態をスレッド(たとえば、ユーザーIDまたはトランザクションID)に関連付けたいクラスのプライベート静的フィールドです。」 しかし、私の質問はなぜ彼らがそれを静的(通常)にすることを選んだのかです-「スレッドごと」の状態を持つことは少し混乱しますが、フィールドは静的ですか?

6
WAITスレッドとBLOCKEDスレッドの状態の違い
スレッド状態WAITとスレッド状態BLOCKEDの違いは何ですか? Thread.Stateのドキュメント: ブロック モニターロックを待機してブロックされているスレッドは、この状態です。 待機中 別のスレッドが特定のアクションを実行するのを無期限に待機しているスレッドは、この状態です。 違いを私に説明しません。

5
Pythonの「スレッドローカルストレージ」とは何ですか。なぜ必要なのですか。
特にPythonでは、変数はどのようにスレッド間で共有されますか? threading.Thread以前に使用したことはありますが、変数が共有される方法の例を実際に理解したり見たりしたことはありません。それらはメインスレッドと子供の間で共有されますか、それとも子供の間だけですか?この共有を避けるために、スレッドローカルストレージをいつ使用する必要がありますか? ロックを使用してスレッド間で共有データへのアクセスを同期することに関する多くの警告を見てきましたが、問題の本当に良い例はまだ見ていません。 前もって感謝します!

2
Javaスレッドダンプを分析する方法
私はjavaについて、特にメモリ管理とスレッドについてもっと理解しようとしています。このため、最近スレッドダンプを調べることに興味を持ちました。 以下は、Java用の組み込みツールであるVisualVMを使用してWebアプリから取得した数行です。 "Finalizer" daemon prio=8 tid=0x02b3d000 nid=0x898 in Object.wait() [0x02d0f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) - locked <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) Locked ownable synchronizers: - None "Reference Handler" daemon prio=10 tid=0x02b3b800 nid=0x494 in Object.wait() [0x02cbf000] java.lang.Thread.State: …

9
キューに入れる前にThreadPoolExecutorでスレッドを最大に増やす方法は?
私はしばらくの間、多くの人が使用するスレッドプールThreadPoolExecutorをサポートするデフォルトの動作にイライラしてきましたExecutorService。Javadocsから引用するには: corePoolSizeを超えてmaximumPoolSize未満のスレッドが実行されている場合、キューがいっぱいの場合にのみ、新しいスレッドが作成されます。 これは、次のコードでスレッドプールを定義した場合、が無制限であるため、2番目のスレッドを開始しないことを意味しますLinkedBlockingQueue。 ExecutorService threadPool = new ThreadPoolExecutor(1 /*core*/, 50 /*max*/, 60 /*timeout*/, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(/* unlimited queue */)); 制限付きキューがあり、キューがいっぱいの場合のみ、コア番号を超えるスレッドが開始されます。多くのジュニアJavaマルチスレッドプログラマーは、このの動作に気付いていませんThreadPoolExecutor。 これで、これが最適ではない特定のユースケースがあります。私は自分のTPEクラスを書かずに、それを回避する方法を探しています。 私の要件は、おそらく信頼できないサードパーティにコールバックするWebサービスに対するものです。 コールバックをWebリクエストと同期させたくないので、スレッドプールを使用します。 私は通常、1分間に数回これらを取得するのでnewFixedThreadPool(...)、ほとんどが休止状態である多数のスレッドを使用したくありません。 頻繁にこのトラフィックのバーストが発生し、スレッド数をいくつかの最大値(50としましょう)にスケールアップしたいと思います。 すべてのコールバックを最善の方法で試行する必要があるので、50を超える追加のコールバックをキューに入れますnewCachedThreadPool()。 スレッドを開始する前にThreadPoolExecutorキューを制限していっぱいにする必要があるこの制限を回避するにはどうすればよいですか?タスクをキューに入れる前に、より多くのスレッドを開始するにはどうすればよいですか? 編集: @FlavioはThreadPoolExecutor.allowCoreThreadTimeOut(true)、コアスレッドをタイムアウトさせて終了させるためにを使用することについて良い点を示しています。私はそれを考えましたが、それでもコアスレッド機能が欲しかったです。可能であれば、プール内のスレッド数がコアサイズを下回らないようにしたいと思いました。

3
新しいLinuxカーネルでは、コンテキストの切り替えが非常に遅くなります
サーバーのOSをUbuntu 10.04 LTSからUbuntu 12.04 LTSにアップグレードする予定です。残念ながら、実行可能になったスレッドを実行するための待ち時間は、2.6カーネルから3.2カーネルに大幅に増加したようです。実際、私たちが得ている待ち時間の数値は信じがたいものです。 テストについてより具体的に説明します。2つのスレッドを実行するプログラムがあります。最初のスレッドは現在の時刻(RDTSCを使用したティック単位)を取得し、1秒に1回条件変数を通知します。2番目のスレッドは、条件変数で待機し、シグナルが送られると起動します。次に、現在の時刻を取得します(RDTSCを使用したティック単位)。2番目のスレッドの時間と最初のスレッドの時間の差が計算され、コンソールに表示されます。この後、2番目のスレッドは条件変数をもう一度待機します。約2秒後、最初のスレッドによって再度シグナルが送信されます。 つまり、結果として、1秒に1回、条件変数のレイテンシ測定を介してスレッド間通信を取得します。 カーネル2.6.32では、この待ち時間は2.8〜3.5 us程度であり、これは妥当です。カーネル3.2.0では、このレイテンシは40〜100 us程度に増加しています。2つのホスト間のハードウェアの違いを除外しました。それらは同一のハードウェアで動作します(ハイパースレッディング、スピードステップ、およびすべてのC状態がオフの状態で3.6 GHzで動作するデュアルソケットX5687 {Westmere-EP}プロセッサー)。テストアプリは、同じソケットの独立した物理コアで実行するようにスレッドのアフィニティを変更します(つまり、最初のスレッドはCore 0で実行され、2番目のスレッドはCore 1で実行されます)。したがって、スレッドのバウンスはありません。コアまたはソケット間のバウンス/通信。 2つのホストの唯一の違いは、1つはカーネル2.6.32-28(高速コンテキストスイッチボックス)でUbuntu 10.04 LTSを実行しており、もう1つはカーネル3.2.0-23(低速コンテキスト)で最新のUbuntu 12.04 LTSを実行していることです。スイッチボックス)。BIOS設定とハードウェアはすべて同じです。 スレッドの実行をスケジュールするのにかかる時間のこのとんでもない速度低下を説明できるカーネルの変更はありましたか? 更新: ホストとLinuxビルドでテストを実行したい場合は、閲覧用のコードをペーストビンに投稿しました。コンパイル: g++ -O3 -o test_latency test_latency.cpp -lpthread 実行(少なくともデュアルコアボックスがあると仮定): ./test_latency 0 1 # Thread 1 on Core 0 and Thread 2 on Core 1 更新2:カーネルパラメータの検索、カーネルの変更に関する投稿、および個人的な調査の結果、問題が何であるかがわかり、この質問に対する回答として解決策を投稿しました。

5
タスクが完了するまで待機しています
DispatchQueueのタスクが完了するまでコードを待機させるにはどうすればよいですか?CompletionHandlerか何かが必要ですか? func myFunction() { var a: Int? DispatchQueue.main.async { var b: Int = 3 a = b } // wait until the task finishes, then print print(a) // - this will contain nil, of course, because it // will execute before the code above } 私はXcode 8.2を使用していて、Swift 3で作成しています。

4
DispatchQueue.main.asyncとDispatchQueue.main.syncの違い
DispatchQueue.main.asyncUI関連の操作に長年使っています。 Swiftはとの両方DispatchQueue.main.asyncを提供しDispatchQueue.main.sync、どちらもメインキューで実行されます。 誰かがそれらの違いを教えてくれますか?それぞれをいつ使用すればよいですか? DispatchQueue.main.async { self.imageView.image = imageView self.lbltitle.text = "" } DispatchQueue.main.sync { self.imageView.image = imageView self.lbltitle.text = "" }

3
現在のSynchronizationContextはTaskSchedulerとして使用できません
Tasksを使用してViewModelで長時間実行されているサーバー呼び出しを実行していますが、結果はをDispatcher使用してマーシャリングされTaskScheduler.FromSyncronizationContext()ます。例えば: var context = TaskScheduler.FromCurrentSynchronizationContext(); this.Message = "Loading..."; Task task = Task.Factory.StartNew(() => { ... }) .ContinueWith(x => this.Message = "Completed" , context); アプリケーションを実行すると、これは正常に機能します。しかし、NUnitテストを実行すると、次Resharperのように呼び出すとエラーメッセージが表示されますFromCurrentSynchronizationContext。 現在のSynchronizationContextはTaskSchedulerとして使用できません。 これは、テストがワーカースレッドで実行されるためだと思います。テストがメインスレッドで実行されるようにするにはどうすればよいですか?その他の提案は大歓迎です。

3
スレッドが同じPIDを共有している場合、どのようにしてそれらを識別できますか?
Linuxでのスレッドの実装に関連するクエリがあります。 Linuxは明示的なスレッドをサポートしていません。ユーザー空間では、スレッドを作成するためにスレッドライブラリ(NPTLなど)を使用する場合があります。NPTLを使用すると、1:1マッピングがサポートされます。 カーネルはこのclone()関数を使用してスレッドを実装します。 4つのスレッドを作成したとします。それからそれはそれを意味するでしょう: 4になりtask_structます。 の内部ではtask_struct、クローンを作成するための引数に従って共有リソースのプロビジョニングが行われ(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)ます。 今私は次のクエリを持っています: 4つのスレッドは同じPIDを持ちますか?誰かが詳しく説明できる場合、PIDがどのように共有されるか。 異なるスレッドはどのように識別されますか。TID(スレッドID)の概念はありますか?

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