問題タブ [starvation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
98 参照

php - PHP 群れはどのようにして飢餓を防いでいるのですか?

PHP flock() 関数について質問があります。

PHP flock() はプロセスの枯渇をどのように防ぐことができますか?

常にファイルを読み込もうとするプロセス R と、読み込みが完了するたびにファイルに書き込みたい (排他ロックが必要な) プロセス W があるとします。プロセス W が枯渇しないようにするにはどうすればよいでしょうか?

flock() を使用してプロセス W を PHP で枯渇させないようにする方法はありますか?

0 投票する
1 に答える
854 参照

java - リスト全体をロックせずにリンク リスト ノードをスレッド セーフに切り替える

synchronized私はスレッド、ロックなどについて学んでいます。したがって、キーワードやそれ以外のクラス (アトミック変数なし) は使用thread-safeしたくありません。semaphoreReentrantLock

のサイズで順序LinkedList<T>を同期させたいと思います(これは、関数と関数を持っていると仮定します)。すべてのリストをロックせずに、関数によって2つを置き換えることができるようにしたい.Node<T>TTimplementsinterfacesizeincrementlockunlockNodesT.getSize()

たとえば、スレッドが 1 つしかない場合、関数は次のような「古典的な」置換関数になります。

同期の問題に取り掛かりましょう。

lock私は自分のためにを作成するためにそのようなことをしようと考えましたNodes:

問題は、これがスレッド セーフではないことであり、デッドロックが発生する可能性があります。たとえば、スレッド A が a で置換関数を使用しようとしてNode a, Node ba.next == b and b.prev==aて、スレッド B が b で置換関数を使用しようとしている場合、両方がロックされ、どこにも到達しないと仮定します。

リスト全体thread safeなしで置換機能を作成するにはどうすればよいですか? とlockを避けたい。dead-lockstarvation

ありがとう!

0 投票する
1 に答える
548 参照

c++ - ライタースレッドを枯渇させる方法

C++14 の shared_timed_mutex を使用して、リーダーライター問題の実装を作成しました。私の意見では、データベース (この例では単純な配列) で常に多くのリーダー スレッドが動作しているため、次のコードは Writer を枯渇させるはずです: ライターはロックを取得する機会がありません。

スレッドが読み取り、書き込み、ブロック モードまたはtry_lock()メソッド経由でロックを取得しようとしているときに、標準出力にいくつかの出力を追加しましたが、わかりやすくするために出力を削除しました。main メソッドのさらに下のスレッドを開始します。プログラムを実行すると、ライターは常に配列に書き込む機会を得ます (すべてのリーダー スレッドがブロックされますが、これは問題ありません)。多くのリーダー スレッドが配列から読み取ります。リーダー スレッドをまったくスリープさせない場合でも (引数 0)、ライター スレッドはミューテックスを取得する方法を見つけます。その場合、ライターを飢えさせるにはどうすればよいですか?

0 投票する
1 に答える
106 参照

ssl - 読み取りまたは書き込み中の無限の再ネゴシエーションによる DoS

OpenSSL および/または SSL/TLS プロトコルは、無限の再ネゴシエーションに対する何らかの組み込みの保護を提供しますか?

特に、SSL_read()リモート側が (おそらく悪意を持って) ペイロード データを送信せずに再ネゴシエーションを要求し続けるため、 が永久に実行し続けることは可能ですか?

ポーリングメカニズムを使用して単一のスレッドから多数の SSL 接続を処理し、1 つの接続での I/O の処理が I/O の枯渇につながらない形式の公平性を確保したいため、これについて心配しています。他の接続。

非ブロッキング モードのソケットでregular を呼び出すとread()、バッファーが最終的にいっぱいになるため、永久に実行し続けることができないことがわかります。

ただし、SSL_read()再ネゴシエーションを透過的に処理できるため、リモート側が (おそらく悪意を持って) ペイロード データを送信せずに再ネゴシエーションを要求し続け、基になるトランスポート層が基になる読み取りと書き込みEWOULDBLOCKSSL_read().永久に実行されることになり、それによって他の接続が不足します。

したがって、私の質問: OpenSSL またはプロトコルには、それを回避するメカニズムがありますか? ちなみに、質問は同様に適用さSSL_write()れます。

編集:たとえば、基礎となる読み取り/書き込み操作が決して失敗しない場合でも、複数の再ネゴシエーションに従事する前に/指示SSL_read()で戻ることを確認できますか?SSL_ERROR_WANT_READSSL_ERROR_WANT_WRITEEWOULDBLOCK

編集: この質問の目的のために、通常のソケット BIO ( BIO_s_socket()) を使用しており、基になるソケットが非ブロック モードであると仮定します。

0 投票する
2 に答える
2337 参照

c++ - スレッド枯渇を防ぐ方法

待ち時間ゼロのクラウド ゲーム サーバーを作成しています。これはソフトウェア パイプラインです。最初の段階で画面をキャプチャし、2 番目の段階でそれをビデオにエンコードします。

ただし、しばらくすると、2 番目のステージがフリーズします。プラットフォームに依存しない多くのアプローチを試しましたが、どちらも最終的にフリーズします。C++11 でスレッドが枯渇するのを防ぐ方法の回答では、ミューテックスを使用する必要があると述べられています。私はそれを試してみました。そして、それはより長く続く可能性がありますが、それでも時々フリーズします(まれに)。ミューテックスも、スレッドの枯渇を防ぐための明示的なヒントではないと思います。(もしかしたら私のやり方が悪いのでしょうか?)

現在、私はミューテックスを使用し、同時に Windows 優先順位ブースト機能を無効にしていますが、この解決策はまったく好きではありません。誰も飢餓のない生産者と消費者の例を提供できますか(C++ 11の方が良い)?

プロデューサー:

消費者:

最初は、循環キューに対する保護は何もしませんでした。競合状態 (1 つのプロデューサーと 1 つのコンシューマー) はないと思います。次に、ミューテックスを追加しようとしましたが、何も変わりません....