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


5
ロックされていないミューテックスのロックはどの程度効率的ですか?ミューテックスのコストはいくらですか?
低レベル言語(C、C ++など):ミューテックスの束(pthreadが提供するものやネイティブシステムライブラリが提供するものなど)とオブジェクトの単一のミューテックスのどちらを使用するかを選択できます。 ミューテックスをロックすることはどのくらい効率的ですか?つまり、アセンブラー命令はいくつありますか。また、それらにかかる時間(ミューテックスがロック解除されている場合)はどれくらいかかりますか? mutexの費用はいくらですか?ミューテックスを本当にたくさん持つのは問題ですか?または、私がint変数を持っているのと同じくらい多くのミューテックス変数をコードにスローすることはできますか? (ハードウェアの違いはどれくらいかわかりません。ある場合は、それについても知りたいのですが、ほとんどの場合、共通のハードウェアに興味があります。) 重要なのは、オブジェクト全体に対して単一のミューテックスではなく、オブジェクトの一部のみをカバーする多くのミューテックスを使用することで、多くのブロックを安全にできることです。そして、これについてどこまで行けばいいのかと思っています。つまり、どれほど複雑で、これが何個のミューテックスを意味するかに関係なく、可能なブロックを可能な限り安全に保護する必要がありますか? ロックに関するWebKitsブログ投稿(2016)は、この質問に非常に関連しており、スピンロック、アダプティブロック、futexなどの違いについて説明しています。

8
ServerSocketのaccept()メソッドを中断するにはどうすればよいですか?
メインスレッドには、ServerSocketオブジェクトwhile(listening)を呼び出すループがありaccept()、新しいクライアントスレッドを開始し、新しいクライアントが受け入れられたときにコレクションに追加します。 また、「exit」などのコマンドを発行するために使用する管理スレッドがあります。これにより、すべてのクライアントスレッドがシャットダウンされ、それ自体がシャットダウンされ、メインスレッドがシャットダウンされます。 ただし、ループ内のaccept()呼び出しはwhile(listening)ブロックされ、それを中断する方法がないように見えるため、while条件を再度チェックすることはできず、プログラムは終了できません。 これを行うより良い方法はありますか?または、ブロッキング方法を中断する方法はありますか?

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で取得したコールバックを実行します。 それはどのように機能しますか?そうでない場合、どのように機能しますか?つまり、スタックを明示的に操作する必要なく、イベントシステムが機能できるということです(スレッドを切り替えながらスタックをバックアップし、別のスレッドのスタックをメモリにコピーする必要がある実際のスケジューラなど)。これで実際にどれだけの時間を節約できますか?もっとありますか?

5
非同期、ノンブロッキング、イベントベースのアーキテクチャの違いは何ですか?
違いは何ですか: 非同期、 ノンブロッキング、および イベントベースのアーキテクチャ? 何かを非同期と非ブロッキング(およびイベントベース)の両方にすることはできますか? プログラミングで最も重要なことは、非同期、非ブロッキング、および/またはイベントベース(または3つすべて)です。 あなたが例を提供することができれば、それは素晴らしいことです。 私が同様のトピックに関するこの素晴らしいStackOverflowの記事を読んでいたので、この質問が尋ねられていますが、それは上記の私の質問に答えていません。

6
take()でブロックしているBlockingQueueに割り込む方法は?
からオブジェクトをBlockingQueue取得take()し、連続ループで呼び出すことによってそれらを処理するクラスがあります。ある時点で、これ以上オブジェクトがキューに追加されないことがわかりました。take()メソッドを中断してブロックを停止するにはどうすればよいですか? オブジェクトを処理するクラスは次のとおりです。 public class MyObjHandler implements Runnable { private final BlockingQueue<MyObj> queue; public class MyObjHandler(BlockingQueue queue) { this.queue = queue; } public void run() { try { while (true) { MyObj obj = queue.take(); // process obj here // ... } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } …

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