問題タブ [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.
c++ - C++マルチスレッド同期
これが私の問題の簡略版です。
無限ループで次の3つの命令を実行するN個のスレッドがあります。
すべてのスレッドが命令Bを同時に実行するようにしたい、つまり、すべてのスレッドがBに到達した場合にのみ、任意のスレッドによるBの実行を開始する必要があります。したがって、B-> C-> Aを実行したスレッドがある場合は、他のスレッドまでここで待機する必要があります。スレッドもBを実行する準備ができています。
可能であれば、WindowsとMACの両方で動作するポータブルソリューションを教えてください。
java - Java 同期ブロックがどのように機能するかを示すサンプル コード
私はJavaマルチスレッドを学んでいますが、同期ブロックがどのように機能するかを理解するのは難しいことがわかりました:
オブジェクト o がブロックされていることを示すコード例を教えてください。これをどのように理解しているかとして、同期ブロックが実行されている間、別のスレッドからオブジェクト o にアクセスするとブロックされますか?
c# - ユーザー スコープのアプリケーション設定 (VS デザイナーで作成) はスレッド セーフですか?
ユーザー スコープの設定とアプリケーション スコープの設定の両方を含む、Visual Studio プロジェクトでアプリケーション設定を作成しました。私のアプリケーションには、読み取りまたは書き込みの設定に同時にアクセスできる複数のスレッドがあります。MSDN を検索して、実行時に更新できるユーザー スコープの設定がスレッド セーフかどうかを確認しましたが、明確な答えが見つかりませんでした。誰か知っていますか?
前もって感謝します!
multithreading - 私の DirectShow プッシュ ソース フィルターのこの Windows スレッド同期戦略は (かなり) 防弾ですか?
DSPACK コンポーネント ライブラリを使用して、Delphi 6 で記述された DirectShow プッシュ ソース フィルタがあります。プッシュ ソース フィルターの FillBuffer() 呼び出しのブロック戦略を実装しています。プッシュ ソース フィルターは、バッファーのコレクションに格納されている 1 つ以上のバッファーにオーディオ データを受け取ります。バッファー コレクション内のすべてのメソッドは、クリティカル セクションによって保護されます。
コレクション内の各バッファーには異なるソースからデータが供給されており、各ソースには独自のスレッドがあります。FillBuffer() 呼び出しは、呼び出し元に返されるマージされたバッファーを形成するためにデータが混合されるため、FillBuffer() が提供するように要求されたデータの量を満たすのに十分なデータがコレクション内のすべてのバッファーになるまでブロックされます。
これが、競合状態とデッドロックを回避するために私が考案した戦略です。バッファ ストレージ コレクションには、これを行うisEnoughData()というメソッドがあります。
- コレクション内の他のすべてのメソッドを保護している同じクリティカル セクションを取得します。
- 各バッファーのチェックを繰り返して、各バッファーに現在の要求を満たすのに十分なデータがあるかどうかを確認します。
- 十分なデータがある場合、TRUE を返します
- 十分なデータがない場合、ブロックを容易にするために使用されるMutexを取得し、FALSE を返し、FNumPendingBytesRequested に満たすことができなかった要求されたバイト数を格納します。
- もちろん、戻る前にクリティカルセクションを解放します。
FillBuffer() は次のことを行います。
- isEnoughData() を呼び出します
- TRUE が返された場合は、混合 (マージされたバッファー) データが提供されたサンプルで呼び出し元に返されます。
- FALSE の場合、上記のisEnoughData()呼び出し中にコレクションによって取得されたMutexで WaitForSingleObject() を実行し、十分なデータが表示されるまでブロックします。Mutexを取得すると、コレクションからデータを取得して呼び出し元に返し、Mutexを解放します。
コレクション内の任意のバッファーにデータを追加するストレージ コレクション内のすべてのメソッドは、戻る前に FNumPendingBytesRequested を満たすことができるかどうかを確認します。その場合、Mutexが解放され、それによって FillBuffer() 呼び出しのブロックが解除され、データが取得されて返されます。当然のことながら、コレクションは破棄されるとMutexを解放します。
これは私にはかなり防弾のようです。isEnoughData() への FillBuffer() 呼び出しと、コレクションにデータを追加する他のスレッドとの間の競合状態から適切に保護すると思います。また、競合状態やデッドロックが発生する可能性のある場所もわかりません。私はこれで正しいですか?戦略に関するヒントや注意事項も大歓迎です。
大きな問題: 私が見ることができる唯一の潜在的な問題点は、FillBuffer() がWaitForSingleObject()を呼び出してブロックする前にMutexを解放するのに十分なデータを別のスレッドが追加するかどうかです。しかし、私の理解では、誰も所有していない同期オブジェクトでWaitForSingleObject()を呼び出すと、オブジェクトの所有権がすぐに返されるため、必要なデータが利用可能になったことを意味するため、問題にはなりません。私の理解は正しいですか?
java - Java スレッド プールの同期
次のアルゴリズムを実行したい - これは Java で行う必要がある
オーバーヘッド (および各スレッドの作業時間が 20 ミリ秒未満であるという事実) のために、スレッドが継続的に作成および破棄されないことが望ましいため、スレッド プール1のアイデアが生まれました。また、 Executable 2を使用すると、シャットダウンを呼び出してから awaitTermination を呼び出すことができることも知っています。ただし、ループがあるため、この場合は望ましくありません。では、スレッド同期はどのようにして発生するのでしょうか?
従来のスレッドの join() メソッドを使用して行われるように、スレッド プール内のスレッドを同期したいと考えています。
.net - スレッドプールの実装を学ぶ-autoreseteventを使用するとシグナルイベントが失われる
私は再発明による学習を強く信じています。そのような心構えで、私はカスタムスレッドプールの実装に着手しました。私が自分で設定した目標は次のとおりです。
- スレッドプールで作業項目をキューに入れることができるようにするため。
- 固定数のスレッドで作業項目を処理できるようにするため–すべて同時に作成されます。
- 一般的なワーカースレッド関数は、両端キューの方法のみを知っている必要があり、IsEmptyやCountなどの他の関数/プロパティを処理するべきではありません。
私は上記の目的を達成することに成功しましたが、スタックオーバーフローの専門家と一緒に取ったアプローチを検証したいと思います。また、より良いアプローチがあるかどうか、またはマルチスレッドの専門家がこの問題をどのように解決するかを知りたいと思います。次の段落では、私が直面した課題とそれをどのように修正したかについて説明しました。
私が作成したスレッドプールは、すべてのワーカースレッドがアイテムを選択して処理する作業アイテムのキューを内部的に維持していました。新しいアイテムがキューに入れられると、フリースレッドがそれを取得して実行できるようにイベントを通知します。
autoreseteventを開始して、キュー上の新しい作業項目の待機中のスレッドに通知しましたが、通知されたイベントが失われるという問題に直面しました。これは、複数のアイテムがキューに入れられ、アイテムを処理するための空きスレッドがない場合に発生します。未処理のまま残っているアイテムの合計は、セット(シグナリング)イベントが重複しているために失われたシグナルイベントの合計と同じです。
シグナルイベントが失われる問題を修正するために、autoreseteventの上にラッパーを作成し、autoreseteventの代わりに使用しました。問題を修正しました。同じもののコードリストは次のとおりです。
今、私はいくつかの質問があります:
- 私のアプローチは完全な証拠ですか?
- この問題に最適な同期メカニズムとその理由は何ですか?
- マルチスレッドの専門家はこの問題にどのように対処しますか?
ありがとう。
java - Javaの効率に影響を与えずにスレッド同期を実現する方法
次の関数を使用して言います。
このメソッドが同時に呼び出されると、複数のスレッドがMyObjectの同じ値を共有しますが、各スレッドが一意の値を持つことを期待していました。
これを修正するために、スレッド同期を使用class.getInstance().myMethodCall()
していくつかのプロパティの一意の値を取得しました。これで目的は解決しましたが、同時呼び出しが発生すると、関数の効率が低下します。
これを修正するためのより良い方法はありますか?(STRUTS、HIBERNATE3.0を使用)
multithreading - この場合のスレッド同期の設計方法
私の要件は次のとおりです
- 複数のスレッドを持つプロセスがあります。
- スレッドの 1 つ (T1) は、ユーザー イベントによってトリガーされます。
- 別のスレッド (T2) で実行する必要があるタスクがあり、T1 によって生成される必要があります。
- ここで、T1 は、システムが T2 のタスクをまだ実行していないことを確認する必要があります。そうでない場合は、T2 を生成してから終了する必要があります。T2 がまだ実行されている場合は、エラーをログに記録して T1 から戻る必要があります。T2 が完了するまで T1 を保持したくありません。
- 通常、T2 には長い時間がかかります。したがって、T2 が終了する前に T1 がトリガーされた場合、エラーが返されます。
- T2 のスレッドを 2 つ持つべきではないという意図はありません。
これを行うためにミューテックスとセマフォを使用していますが、もっと簡単な方法があるかもしれません。これが私がすることです。
T1:
T2:
そして、これはうまくいきます。しかし、これを行うより簡単な方法があるかどうか知りたいです。
c# - WIAScanner クラスはフラットベッドでのみスキャンしています。デバイスのプロパティが null です...何が問題なのですか?
http://miljenkobarbir.com/using-a-scanner-without-dialogs-in-net/からこの既存のクラスを使用して いますが、まったく機能していません。ドキュメント フィーダーからスキャンするはずのときに、フラットベッドからスキャンします。動作する唯一のことは、ワイヤレスのデバイスを検出することですが、デバイスのプロパティは null です。例外はスローされません。
PS UIスレッドではなく別のスレッドからScanメソッドを呼び出していますが、以下のようなロックを使用しました
java - 2 スレッドの ArrayList で NullPointerException を回避する方法
Android ゲームを作成していて、問題が発生しました。OpenGLスレッドとゲームループの2つのスレッドがあります。レンダリング可能なオブジェクトを格納するために ArrayLists を使用していますが、ここに問題があります。ゲームスレッドでこれらのオブジェクトを削除する必要がある場合があり、OpenGL スレッドが NullPointerException を取得することがあります。これは、私が理解しているように、コレクションを通過して突然要素が削除されるためです。OpenGL スレッドにオブジェクトを削除させるべきだと思いますが、他の解決策はありますか?また、ゲーム ループが null 要素を取得し始めた場合はどうなりますか? 「同期」がどのように機能するかはまだわかりませんが、どうにかしてスレッドを同期させることができるかもしれません。ありがとう。
これは役に立ちますか?そして、ArrayList を使って何かをする場所ならどこにでも配置する必要がありますか?