問題タブ [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 に答える
726 参照

cuda - CUDA で __syncthreads() 関数を呼び出す場所

私はいくつかのブール変数を持っており、各スレッドはそれで動作する必要があります。したがって、それらを同期する必要があります。これ__syncthreads()は、プログラムで関数を呼び出す必要があることを意味しますが、どこで呼び出すかわかりません。

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

java - コールバックの notify() によって通知されない wait()

問題は簡単です。Android では、ライブラリ関数を呼び出す必要があるメソッドがあります。この呼び出しは、処理する必要があるコールバックを通知します。メソッドから戻る前に、そのコールバックが通知されるのを待つ必要があります。

モニター オブジェクトの wait() メソッドと notify() メソッドがうまくいくと思いました。そうではありません。

Connection基本的に、呼び出し元のメソッドでインスタンス化する監視オブジェクトが呼び出されます。次に、このメソッドは、Android ライブラリ メソッドを呼び出してオブジェクトを「登録解除」するループを実行します。残念ながら、このメソッドへの応答は何らかのコールバックで提供されます。そのため、このメソッドを使用しConnection.wait(10000)てコールバックを待機し、コールバックでは、connection.notify()完了したときに通知するために使用します (もちろん、すべて同期されています)。ただし、connection.notify()は をリリースしませんconnection.wait(10000)。Android logcat から、登録解除が成功したことがわかりますが、次の登録解除タスクが試行されるまで、常に 10 秒待たなければなりません。

呼び出しメソッドとコールバックのコードは次のとおりです。これが失敗するという私の推論で、私はなんてばかげた仮定をしていますか。私が見る限り、呼び出し元のメソッド (スレッド) は確実に監視オブジェクトを所有し、connection.wait(10000)!のコールバックにそれを渡します。

たぶん、この問題に対して完全に間違ったアプローチを使用していますか? (私が欲しいのは、すべての登録解除が完了するまで発信者をブロックする方法です。)

コールバックは次のとおりで、上記のメソッドと同じクラスですが、Android で非常に人気のある「onSomeEvent()」の 1 つです。

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

multithreading - WINAPI でスレッドを同期する

スレッドを WINAPI 呼び出しのみと同期したいのですが、うまくいきません。状況は、WNDPROC がメッセージを受け取るとすぐに、時刻と日付で活動をログに記録することです。問題は、私の WNDPROC がログに書き込む必要があり、ファイルへの書き込みに時間がかかるため、手に負えなくなることです。WNDPROC が起動したらすぐにクリティカル セクションに入り、ログへの書き込みが終了したらすぐにクリティカル セクションから出ようとしましたが、うまくいきませんでした。どうすればお互いを待たせることができますか?

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

c - C アトミック操作、書き込みがすべてアトミック スワップの場合、アトミック ロードは必要ですか?

私は C でプログラムを書いています。簡単に言うと、多くのスレッドが読み書きできる変数がいくつかあります。これらのいずれかが書き込まれるたびに、アトミック スワップ (GCC アトミック操作、同期およびスワップ) を介して書き込まれます。これらの変数のいずれかを読み取るたびにアトミック ロードを使用する必要がありますか?それとも、アトミック ライトは書き込み中のデータの読み取りを回避するのに十分ですか?

これらの変数のいずれかからのデータを使用する必要がある場所では、最初に値をコピーすることに注意してください。

私の質問はデータ競合に関するものではありません。つまり、データが失われる可能性はありません。私の懸念は、shared_x の値が読み取りの途中で変わる可能性があることです。これが 8 バイト整数であるとします。これは潜在的な問題になるでしょうか。shared_x が 64 ビット整数、8 バイトであるとします。my x = shared_x が最初の 4 バイトをコピーし、次に何かがアトミックに shared_x に書き込み、このステートメントが 2 番目の 4 バイトの読み取りを終了する可能性はありますか。これにより、x には、shared_x の古い値の最初の 4 バイトと、新しい shared_x の最後の 4 バイトが含まれます。アトミック スワップ ( http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html - __sync_bool_compare_and_swap を使用) のメモリ バリアは、これを防ぐのに十分だと思います... しかし、私はわかりません。

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

c# - 特定の遅延のあるスレッドからのメソッド呼び出し

スレッドが500msのスリープ後にこのメソッドを呼び出すことができるように、メソッド呼び出しを同期する必要があります。同時に実行できるスレッドが10個あるので、単に紹介するだけでThread.Sleep(500)は役に立ちません。どうすればこれを最も簡単な方法で達成できますか?あなたは何を提案できますか?

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

c++ - 特定のイベントが通知されたときに実行中のスレッドをすぐに終了させる

次のスレッド関数を検討してください。

このスレッドは、アプリケーションのダイアログによって作成されます。このスレッドは、ダイアログの存続期間中に 1 回だけ実行されます (これはワーカー スレッドです)。

何らかの非同期イベント (ボタンのクリック、その他のイベントの通知など) が発生した場合、このスレッドがすぐに戻るように通知して、(このスレッドが終了するのを待った後) ダイアログが正常に終了できるようにします。このスレッドはまだ実行されているため、ダイアログを終了することはできません。

私はC ++に比較的慣れていませんが、これは私が考えていたものです(疑似コード):

  1. スレッド関数を で囲みますtry-catch
  2. その非同期イベントの発生時に、スレッド終了例外をスローします。

これはうまくいかなかったので、少し調べたところ、これに似た答えが見つかりまし。しかし、何らかの理由で、これを達成するためのはるかに簡単な方法があると感じています。上記のアイデアを実装する前に、明確にしたかっただけです。

ありがとう!

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

c++ - これはマルチスレッド環境で非干渉になりますか?

特にクリティカル セクションの外側で" while ( i < dq->size()) " を処理する場合、これはデータ競合状態になりますか? 私のアプローチは正しいですか?それ以外の場合は、私に提案してください。

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

android - 関数を同期的に実行する

3 秒間同期的に実装する必要がある関数がいくつかあります。サウンドプール、振動パターン、背景アニメーションを使用してサウンドを再生しています。3 つすべてが個別に正常に動作します。しかし、すべてが一緒に始まるように適切にタイミングを合わせることができません。

これら 3 つの関数は、15 秒ごとに繰り返し呼び出す必要があります。ボタンクリックで停止します。このようなものを使用してみましたが、正しく動作しません。

これは正しい方法ですか?または他の方法がありますか?

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

c++ - イベントによるスレッド同期のオーバーヘッド

現在、マルチスレッド同期を試しています。バックラウンドには、約 100000 個のオブジェクトのセットがあります。おそらくそれ以上です。1 秒あたり複数回、さまざまな方法で処理したいと考えています。

今、私が最も懸念しているのは、同期のパフォーマンスです。

これは問題なく動作するはずだと思います(これは単なるテストプログラムであり、エラーが発生するとプログラムがクラッシュするため、セキュリティの側面はすべて省略しました..)。私は 2 つの関数を書きました。1 つ目はプログラムのメイン スレッドによって実行され、2 つ目はすべての追加スレッドによって実行されます。

私の要件を指摘するために、簡単な例を挙げます。上記の 100000 オブジェクトを取得し、それぞれ 12500 オブジェクトの 8 つのサブセットに分割し、8 つの論理コアを備えた最新のマルチコア プロセッサを使用するとします。関連する部分は時間です。すべてのタスクは約 8 ミリ秒で実行する必要があります。

私の質問は、分割処理によって時間を大幅に短縮できるか、それともイベントによる同期が高すぎるかということです。または、すべてのタスクをこの方法で実行する必要がある場合、より少ない労力または処理時間でスレッドを同期する別の方法がありますか?

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

c# - Web ページとビジネス層の間でマルチスレッドを同期させる

このコードのチャンクを機能させるのに問題があります (長くなってすみません)。コードは無菌化され、問題の診断に関連する部分のみが表示されます。

コンソール アプリから実行すると正常に動作します。しかし、ASP.NET アプリから Utlities.SendBulkEmail が呼び出されると、BulkEmailCompleted ルーチンは起動されず、m_CompletedWorkers カウンターをインクリメントするのはこのルーチンです。

SendBulkEmail ルーチンをリファクタリングして、BackgroundWorker の代わりに AsyncOperationManager を使用する方法を教えてください。結果が返されるスレッドを保証できます。

SendBulkEmail ルーチン自体はマルチスレッドではありません。マルチスレッドは foreach ループ内で発生します。

元のコードの基礎は次の Web サイトから取得したと思います: http://www.dotnetfunda.com/articles/article613-background-processes-in-asp-net-web-applications.aspx

Utilities プロジェクトはさまざまなソリューション間で共有されており、ほとんど独立しています。

私はこれを明確にすることを望んでいます。

どんな助けでも大歓迎です。

コードは次のとおりです。

Web サイト プロジェクト内 (Control.ascx.cs)

ビジネスオブジェクトプロジェクトで

ユーティリティ プロジェクトで