問題タブ [thread-synchronization]

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 投票する
1 に答える
551 参照

c# - .NETEventWaitHandle遅い

私はコールバック関数でwaveOutWriteを使用していますが、ネイティブコードではすべてが高速です。.NETの下では、それははるかに遅く、私が何か非常に間違ったことをしていると思うところまで、時々5倍か10倍遅くなります。

両方のコードセットを投稿できますが、多すぎるように思われるので、高速なCコードを投稿し、.NETコードのわずかな違いを指摘します。

Cコードのtimes[]配列には、常に約80の値があります。これは、私が使用しているPCMバッファーの長さです。.NETコードでも同様の値が表示される場合がありますが、1000までの値が表示される場合もあり、300〜500の範囲の値が表示される場合もあります。

イベントを使用する代わりに、OnWaveOutコールバック内の一番下のループにある部分を実行すると、.NETまたはネイティブコードを使用して、常に高速になります。したがって、問題は.NETでの待機イベントのみにあり、ほとんどの場合、テストPCで「その他の問題」が発生している場合にのみ発生しますが、多くの問題は発生しません。ウィンドウを移動したり、開いたりするのと同じくらい簡単です。私のコンピューターのフォルダー。

たぶん、.NETイベントは、コンテキストスイッチング、または一般的な.NETアプリ/スレッドについて本当に悪いですか?.NETコードのテストに使用しているアプリでは、コードはスレッドプールスレッドなどではなく、フォームのコンストラクター(テストコードを追加するのに簡単な場所)で実行されます。

また、関数のコールバックの代わりにイベントを受け取るバージョンのwaveOutOpenを使用してみました。これも.NETでは低速ですがCでは低速であるため、イベントやコンテキスト切り替えの問題を示しています。

コードをシンプルにしようとしています。コールバックの外部で作業を行うイベントを設定することが、全体的なデザインでこれを行うための最良の方法です。実際には、イベント駆動型のwaveOutを使用する方がさらに優れていますが、ストレートコールバックが高速であり、通常のイベント待機ハンドルがそれほど遅くなるとは思わなかったため、この別の方法を試しました。

0 投票する
3 に答える
3307 参照

c++ - アトミック/インターロックされた変数は、競合の有無にかかわらず、ロックと比較してどのくらいの速さですか?

std::atomic<T>また、競合のないアトミック変数( C ++など)の操作と比較して、どれだけ高速/低速です。

また、競合していないロックと比較して、競合しているアトミック変数はどれくらい遅いですか?

私が取り組んでいるアーキテクチャはx86-64です。

0 投票する
8 に答える
15980 参照

java - 同期は Java でどのように機能しますか?

Java Synchronization について疑問があります。クラスに 3 つの Synchronized メソッドがあり、スレッドが 1 つの Synchronized メソッドでロックを取得すると、他の 2 つがロックされるかどうかを知りたいですか? 次の文と混同しているため、この質問をしています。

スレッドがオブジェクトの同期メソッド内にある間、この同期メソッドまたはオブジェクトの他の同期メソッドを実行しようとする他のすべてのスレッドは待機する必要があります。この制限は、既にロックを保持しており、オブジェクトの同期メソッドを実行しているスレッドには適用されません。このようなメソッドは、ブロックされることなく、オブジェクトの他の同期メソッドを呼び出すことができます。もちろん、オブジェクトの非同期メソッドは、任意のスレッドからいつでも呼び出すことができます

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

c - C:thread_mutex同期

複数のスレッドの同期に問題があります。元のコードの方が大きいため、同期を「試行」するために行っていることの例のみを投稿します。基本的に、3つのスレッドが接続された重いプロセスがあり、スレッドをロック/ロック解除するために、各スレッドのミューテックス状態を変更する関数を使用します。このようなもの:

コードを実行した後に得られるものは次のとおりです。

。/テスト

靴下:9

明らかに私はいくつかの概念が間違っていますが、問題を見つけることができません。スレッドはunlock()でロック解除されるべきではありませんか?ロック解除呼び出しの前にsleep(2)を使用すると、プログラムが機能するのはなぜですか?問題を回避するには、どちらの方法を使用すればよいですか?各コードは別々のファイルにあります。

前もって感謝します!PS:私のくだらない英語でごめんなさい!

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

c++ - Qtの2つのスレッド間のイベント同期

スレッド「A」とスレッド「B」の2つのスレッドがあります。「A」投稿のカスタムQEventをスレッド「B」にスレッド化し、スレッド「B」がこのイベントを処理するまで待機する必要があります。

私がこれまでにしたこと:

私のイベントクラス:

私のスレッド「A」:

私のスレッド「B」:受信したイベントを処理して破棄します。〜IPCMessageEventデストラクタが呼び出されるため、スレッド「A」内でwakeOne()開始されます。recvCondition

すべてがうまく機能しているようです、それはただ1つのことです!〜IPCMessageEventが予想よりも早く呼び出されることがあるようです...

だから私recvCondition.wait(&mutex, IPC_MESSAGE_WAIT_TIMEOUT);はロックされてタイムアウトになります。

この種の同期を行う他の方法はありますか?または、誰かがこの問題を修正/克服する方法について何か提案がありますか?

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

eclipse - Eclipse RCP--(待機および通知)を使用してスレッドで一時停止/再開ボタン機能を実行する方法

問題文: -

UIボタン「実行」があります。これは、別のスレッドでループ内の大きなバックグラウンドプロセスを順番に開始します。プロセスが開始されるとすぐに、ボタンのテキストが「一時停止」に切り替わります。「一時停止」を押すと、スレッドの実行を一時停止する必要があり、「再開」が最終的に先に進むように通知します。

ボタンを押すと「実行」、スレッドが開始され、ボタンが「一時停止」に切り替わり、一時停止を押すとスレッドが中断されます。しかし、実行中のスレッドを再開できません。再開ボタンを押すイベントでスレッドの状態を確認すると、NONeと同等のvalue=0を取得します。助けてください。以下は私のコードです...

ブロッククォート

0 投票する
3 に答える
5460 参照

c# - TaskCreationOptions.AttachedToParent を使用せずにすべてのタスク (作成されたタスクとサブタスク) を待機する方法

複数のタスクを作成する並行ソフトウェアを作成する必要があり、すべてのタスクは別のタスクを生成できます(別のタスクも生成できます...)。

起動タスクがブロックされているメソッドへの呼び出しが必要です。すべてのタスクとサブタスクが完了する前に戻りません。

このプロパティがあることは知っていTaskCreationOptions.AttachedToParentますが、適合しないと思います:

サーバーには少なくとも8つのコアがあり、各タスクは2〜3のサブタスクを作成するため、AttachedToParentオプションを設定すると、最初のサブタスクの3つのタスクの前に2番目のサブタスクが開始されないという印象があります終了します。したがって、ここではマルチタスクを制限します。

したがって、このプロセス ツリーでは次のようになります。

ここに画像の説明を入力

スレッドを起動するたびに AttachedToParent プロパティを設定すると、E、F、G が終了する前に B が終了しないため、B が終了する前に C が開始され、アクティブなスレッドが 8 つではなく 3 つしかないという印象があります。私は持てます。

AttachedToParent プロパティを配置しない場合、A は非常に高速に終了して戻ります。

では、このオプションを設定しない場合、8 コアを常に完全に使用するにはどうすればよいでしょうか?

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

c# - 関数をブロックし、イベントC#を待ちます

関数をブロックしてイベントを待ってから続行したいのですが、私の場合は、ボタンをクリックしたときに必要な擬似コードです。

  • メッセージボックスをポップアップします
  • datagridviewでイベントクリックを待つ
  • メッセージボックス2をポップアップします
  • datagridviewでイベントクリックを待つ
  • はい/いいえのメッセージボックスをポップアップします
  • 別の機能を実行する

しかし、実際のコードはautoevent.Set()関数を待たないので、メイン関数をブロックしたい間、スレッドによって呼び出された関数はブロックされたままになります。

ManualResetEventとAutoResetEventを試しました。これは、AutoResetEventに使用したコードです。

前もって感謝します

0 投票する
5 に答える
28932 参照

java - ダブルロックを使用しているときにシングルトンインスタンスを揮発性にするポイントは何ですか?

同期にダブル ロック メソッドを使用する場合のシングルトンで、単一インスタンスが volatile として宣言されるのはなぜですか? volatile として宣言せずに同じ機能を実現できますか?

0 投票する
6 に答える
9730 参照

java - Javaの同期ブロックの代替

startTime変数セットを 1 回だけ保証するために、次のコードを使用します。

このコードにより、呼び出しメソッド呼び出しの回数に関係なく、一度だけインスタンス化される変数を保証しprocessます。

私の質問は:

コードをより簡潔にするための代替アプローチはありますか? (サンプルの remove if&synchronizedステートメント用)