問題タブ [autoresetevent]
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.
c++ - C++0x で AutoResetEvent を実装する簡単な方法はありますか?
以前にこの質問をしたことは理解しています: Linux での AutoResetEvent に相当する C++ は何ですか?
ただし、C++0x では、スレッド ライブラリがはるかにシンプルになっていることを学習しているので、この質問をもう一度提起したいと思います.C++0x で AutoResetEvent を実装する簡単な方法はありますか?
c# - AutoResetEventと複数のセット
スタックにアイテムが利用可能になるまでブロックするスタックの周りのデータ構造を設計しようとしています。私は使ってみましたAutoResetEvent
が、その同期プロセスがどのように機能するかを誤解したと思います。基本的に、次のコードを見て、利用可能なものがないときにスタックからポップしようとしています。
AutoResetEvent
はセマフォのように動作しているようです。あれは正しいですか?私はただそれを取り除き、それSet()
で終わらせることができBlockingStack.Get()
ますか?または、スタックアイテムの1つだけを使用している状況になりますか。
私の仮定は、関数呼び出しAutoResetEvent
を通過したときに待機中のすべてのスレッドがリセットされることでした。WaitOne()
ただし、複数のスレッドが入っているようです。どこかでロジックを台無しにしない限り。
編集:これはSilverlight用です。
.net - スレッドプールの実装を学ぶ-autoreseteventを使用するとシグナルイベントが失われる
私は再発明による学習を強く信じています。そのような心構えで、私はカスタムスレッドプールの実装に着手しました。私が自分で設定した目標は次のとおりです。
- スレッドプールで作業項目をキューに入れることができるようにするため。
- 固定数のスレッドで作業項目を処理できるようにするため–すべて同時に作成されます。
- 一般的なワーカースレッド関数は、両端キューの方法のみを知っている必要があり、IsEmptyやCountなどの他の関数/プロパティを処理するべきではありません。
私は上記の目的を達成することに成功しましたが、スタックオーバーフローの専門家と一緒に取ったアプローチを検証したいと思います。また、より良いアプローチがあるかどうか、またはマルチスレッドの専門家がこの問題をどのように解決するかを知りたいと思います。次の段落では、私が直面した課題とそれをどのように修正したかについて説明しました。
私が作成したスレッドプールは、すべてのワーカースレッドがアイテムを選択して処理する作業アイテムのキューを内部的に維持していました。新しいアイテムがキューに入れられると、フリースレッドがそれを取得して実行できるようにイベントを通知します。
autoreseteventを開始して、キュー上の新しい作業項目の待機中のスレッドに通知しましたが、通知されたイベントが失われるという問題に直面しました。これは、複数のアイテムがキューに入れられ、アイテムを処理するための空きスレッドがない場合に発生します。未処理のまま残っているアイテムの合計は、セット(シグナリング)イベントが重複しているために失われたシグナルイベントの合計と同じです。
シグナルイベントが失われる問題を修正するために、autoreseteventの上にラッパーを作成し、autoreseteventの代わりに使用しました。問題を修正しました。同じもののコードリストは次のとおりです。
今、私はいくつかの質問があります:
- 私のアプローチは完全な証拠ですか?
- この問題に最適な同期メカニズムとその理由は何ですか?
- マルチスレッドの専門家はこの問題にどのように対処しますか?
ありがとう。
c# - AutoResetEvent を使用して別のスレッドからの入力を待機する C#
これに対する答えを探すのに時間を費やしたところ、他のスレッドで役立つ情報がたくさん見つかりました。うまくいくようにコードを書いたと思いますが、結果には満足していません。
C# 経由で通信するハードウェアを設計しました。ハードウェアは USB 経由で接続し、OS で列挙した後、初期化ルーチンを実行します。その時点で、C# プログラムがコマンドの送信を開始するのを待つだけです。私の C# コードでは、ユーザーは「接続」ボタンを押す必要があります。これにより、コマンドと必要なペイロードが送信され、実行を継続する必要があることがハードウェアに通知されます。その後、ハードウェアはコマンドを ACK として送り返します。問題は、C# プログラムが ACK の受信を待たなければならないことですが、自由にブロックできる別のスレッドに分割する方法がわからないため、ハードウェアが応答するまで GUI が完全にフリーズします。ハードウェアがすぐに応答する場合は正常に動作しますが、接続できない場合、プログラムは無期限にフリーズしたままになります。
そうは言っても、いくつかのことが起こる必要があることは知っていますが、それらを実装する方法はわかりません。何よりもまず、ループに座ってブール値を待機することは正しい方法ではないと思いますが、AutoResetEvent を使用することは実際にはあまり良くないようです。タイマー、より多くのスレッド、または同様のものを含むより良い方法が必要です。
次のように、serialPort オブジェクトで DataReceived イベントを使用しています。
buttonClick 関数 (「メイン」スレッド) では、プログラムは ACK を待っている間に停止します。
理想的には、タイムアウトが切れたかどうかを知りたいので、「失敗しました!」と出力できます。「成功!」の代わりに。タイムアウトがないということは、上で述べたように、プロセスを強制終了するまで、永遠にそこに留まることも意味します。ハードウェアが見つからない可能性がありますが、見つかった場合は 1 秒未満で応答するはずなので、2 秒のタイムアウトで十分です。Thread.Sleep を使用してみましたが、GUI もフリーズしました。
c# - AutoResetEventセットがタイムアウト後に呼び出されました
MSDNから「待機中のスレッドがない場合、スレッドが待機を試みるまで、またはそのReset
メソッドが呼び出されるまで、待機ハンドルは通知されたままになります。」
スレッド#1:
スレッド#2:
私のアプリケーションでは、スレッド#1が外部アプリにリクエストを送信し、シグナルまたはタイムアウトを待機しています。外部アプリから応答を受信した場合、スレッド#2は待機ハンドルを設定します。これset
は、タイムアウト後でも呼び出すことができます。私の質問は
1)Method2
タイムアウト後に呼び出して、信号を設定できる可能性が高いです。それは、将来スレッド#1へのリクエストがあるときはいつでも、WaitOne(10000)
効果がなく、すぐにリリースされることを意味しますか?
2)タイムアウトの場合に電話をかけないようset
にする方法はありますか?Method2
それはスレッド#1に問題を引き起こしますか?
c# - AutoResetEventはシグナルの前に起動します
以下の方法と同様の方法が2つあります。メソッドでは、MainThreadDoWork
メソッドのautoResetEvent.Set()に関係なく、ループの実行が終了しますOtherThreadWork
。このAutoResetEventインスタンスで何が起こっているのか考えてみてください。
編集
以下は、実際のOtherThreadWorkがどのように見えるかです。
.net - イベントに影響を与えずに AutoResetEvent の値を確認する
.NET (C#) でマルチスレッド サーバー内に「インストルメンテーション」を作成しています。
ManualResetEvent
値の変更を気にせずに .NET の値を確認するのはかなり簡単です。
イベントを待たずにブール値を返します。
AutoResetEvent
ただし、 ;から同じ情報を取得するのに途方に暮れているようです。イベントを呼び出すanAutoResetEvent.WaitOne( 0 )
と、set
返されるときにイベントがリセットされます (定義による)。
この時点で決定できる最善のオプションは、イベントを実際にテストするときに を に変更しAutoResetEvent
、ManualResetEvent
手動でリセットすることです。
の状態を確認するより良い方法はありAutoResetEvent
ますか? AutoResetEvent
可能であれば、の本質的な原子性を好みます。
c# - AutoResetEvent-2つのset呼び出しは、スレッドの解放をすぐに保証しません-なぜですか?
私はMSDNでAutoResetEventのドキュメントを読んでいて、警告に従うとちょっと気になります。
「重要:Setメソッドへのすべての呼び出しがスレッドを解放するという保証はありません。2つの呼び出しが近すぎるため、スレッドが解放される前に2番目の呼び出しが発生すると、1つのスレッドのみが解放されます。まるで2番目の呼び出しは発生しませんでした。また、待機中のスレッドがなく、AutoResetEventがすでに通知されているときにSetが呼び出された場合、呼び出しは効果がありません。」
しかし、この警告は基本的に、そのようなスレッド同期技術を使用する理由そのものを殺します。たとえば、私は仕事を保持するリストを持っています。そして、リストにジョブを追加するプロデューサーは1人だけです。私には消費者(複数)がいて、リストから仕事を得るのを待っています..このようなもの..
プロデューサー:
消費者
上記の警告が当てはまる場合、2つのジョブを非常にすばやくキューに入れると、1つのスレッドだけがジョブを取得しますね。私は、Setがアトミックである、つまり次のことを行うと想定していました。
- イベントを設定する
- スレッドが待機している場合は、1つのスレッドを選択してウェイクアップします
- イベントをリセットする
- 選択したスレッドを実行します。
だから私は基本的にMSDNの警告について混乱しています。有効な警告ですか?
c# - autoresetevent c# のインクリメント
増加するAutoResetEvent、またはc#ライブラリに似たものはありますか?
1つの効率的な実装をどのように展開するか、またはそうせずに述べられた問題に対処するにはどうすればよいでしょうか?
問題:私のニーズを明確にするために、プロデューサー/コンシューマーの状況があり、プロデューサーの数が不明で、コンシューマーの数が固定されています。
編集: 1 つの問題について言及するのを忘れましたConcurrentQueue<T>
。