問題タブ [semaphore]
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# - .NET 同時実行に関する質問: セマフォを別のスレッドに譲ることはできますか?
セマフォの使用を共有する複数のスレッドがあります。スレッド A は (ロックを使用して) セマフォを保持し、スレッド B と C は同じセマフォで待機しています (これもロックを使用)。スレッドはグローバル変数などを共有します。
スレッド B をシャットダウンするために使用できる C# の手法はありますか? A にフラグを設定し、スレッド B にそのフラグをチェックさせて、セマフォの制御を取得したらすぐに終了させることができますが、スレッド A がセマフォをスレッド B に譲ることを許可する手法を知りません (そしてそれを取得します)。スレッド B が終了したときに戻る) スレッド C が制御を奪うリスクはありません。
この設計上の問題に対処する方法について何か提案はありますか? これに間違ってアプローチしている場合は、必要に応じてプログラムを書き直すことができます。
[編集] コメント投稿者から、私が間違った用語を使用していると指摘されました。コメンターは正しいです-私はクリティカルセクションを使用していますが、すべてが単一のプロセスで実行されていることを考えると、この例ではクリティカルセクションはより一般的な用語「セマフォ」と機能的に同等です。
【追記】詳しく知りたいという方がいらっしゃったので、こちらに。
コード A を実行する複数のスレッドが存在する可能性があります。コード B を実行するスレッドは 1 つだけです。
コード A:
コード B:
アーロンのソリューションの変形が私が使用するものになると思います。私は主に、もう少しエレガントな解決策が利用可能であることを望んでいましたが、このプロジェクトに関する他のすべてと同様に、それはすべてブルートフォースとコーナーケースだと思います:-(.
c# - セマフォのすべてのスレッドが完了したことを確認します
Job オブジェクトのリストを介して実行されるセマフォがあります。
コードのサンプルを次に示します。
すべてのジョブ オブジェクトには、ステータス メンバー変数a (0: 新規、1: 進行中、2: 完了、3: 完了したエラーあり) があります。
スクリプトを続行する前に、リスト内のすべてのジョブが完了したことを確認する最善の方法は何かと考えていました。
注:前に ThreadPool と WaitAll を試してみましたが、セマフォのように (二次的な影響なしで) 限られた量のスレッドを持つことができず、ManualResetEvent 配列のサイズの制限にも達しました。 Windows フォーム。
c# - スレッドの実行時に Windows フォームがハングする
JI は Visual Studio 2008 で .NET C# Windows フォーム アプリを作成しました。これは、[開始] ボタンが押されたときにセマフォを使用して複数のジョブをスレッドとして実行します。
40 分以上実行した後、フォームがコンマに入るという問題が発生しています。ログ ファイルは、現在のジョブが完了したことを示し、リストから新しいジョブを選択し、そこでハングします。
これが発生すると、Windows フォームが応答しなくなることに気付きました。フォームは独自のスレッドで実行されています。
これは私が使用しているコードのサンプルです:
//フォームメソッド
//ジョブ.プロセス()
問題が発生している場所を検出するために、できることをファイルに記録しようとしましたが、これまでのところ、問題が発生している場所を特定できませんでした。Windows フォームの制御を失うと、これはジョブの処理とは何の関係もないと思います。何か案は?
解決策: RedGate ANTS でプロファイリングすると、問題が発生していました。直接実行すると発生しません。
mutex - ミューテックスまたはフューテックスのレイテンシーを測定する
ミューテックス、セマフォ、またはフューテックスのレイテンシーを測定するにはどうすればよいですか?つまり、以前にロックされたミューテックスのロックを解除することと、そのミューテックスをロックすることの2つのイベント間のレイテンシーを意味します。2つのケースがあります。すべてのスレッド/プロセスが同じCPU上にある場合(スレッドの再スケジュールにかかる時間)と、最初のスレッドが最初のCPU上にあり、2番目が2番目の場合です。
あるいは
今回は非常に短い(〜1kサイクル)ので使えませんgettimeofday()
.net - .NET で継承可能なセマフォを作成するにはどうすればよいですか?
継承可能な Win32 セマフォ オブジェクトを作成しようとしています。これは、私が起動した子プロセスが、同じ Win32 オブジェクトを操作する権利を自動的に持つ可能性があることを意味します。
私のコードは現在次のようになっています。
ただし、このコードのセマフォ オブジェクトは、子プロセスでは使用できません。
私が書いているコードは、C++ の機能を移植したものです。古い C++ コードは、次の方法でこれを実現します。
その後、CreateProcess
が呼び出されたときに、bInheritHandles
引数が に設定されTRUE
ます。
(C# と C++ の両方のケースで、同じ子プロセス (C++) を使用しています。コマンド ラインでセマフォ ID を取得し、その値を の呼び出しで直接使用しますReleaseSemaphore
。)
スペシャルSemaphoreSecurity
またはProcessStartInfo
オブジェクトを作成する必要があると思われますが、まだわかりません。
c - セマフォとsem_wait()の問題
複数のpthreadで使用されているキュー構造があります。スレッドが空でない場合、スレッドはキューからデキューしてからビジネスを実行することになっています。
私は当初、これをwhileループとして設定し、スレッドがmutex_lockを使用してキューが空かどうかをチェックしました。残念ながら、これは私のプログラムをクロールまで遅くしました。
キューの「カウント」変数としてセマフォを実装しようとしましたが、残念ながら、sem_wait()を呼び出そうとするとセグメンテーション違反が発生します。gdbとsemaphore.hが一緒にうまく機能しないことがわかったので、私は本当に途方に暮れています。私は初心者の間違いを犯している可能性があるので、助けや提案をいただければ幸いです。
キュー構造:
これが初期化です:
そして、私は必ず電話します:
スレッドが作成される前。
これがセグメンテーション違反の呼び出しです
これが私の側の単純な間違いであり、今は見えないことを願っています。
前もって感謝します。
編集:いくつかの明確なコードを追加する
c# - セマフォの順序は保証されていますか?
.NET Semaphore クラスのドキュメントには、次のように記載されています。
ブロックされたスレッドがセマフォに入る FIFO や LIFO などの保証された順序はありません。
この場合、保証された注文 (FIFO または LIFO) が必要な場合、どのようなオプションがありますか? これはなかなかできないことなのでしょうか。独自のセマフォを作成する必要がありますか? 私はそれがかなり高度になると思いますか?
ありがとう、
スティーブ
c# - このセマフォをモニターに置き換えるにはどうすればよいですか?
私の以前の質問で、モニターを使用する場合と比較して、C# ではセマフォを使用する方がコストがかかると誰かが言っていた。このコードのセマフォをモニターに置き換えるにはどうすればよいですか?
(別のスレッドで) function2 が完了した後に function1 がその値を返す必要があります。Semaphore.WaitOne
をaMonitor.Wait
に、Semaphore.Release
をaに置き換えましたMonitor.PulseAll
が、プログラムがハングするPulseAll
前にトリガーされていました。Wait
その競合状態を回避する方法はありますか?
c - Posixセマフォを使用したリクエストの検出
関数mq_receive()でメッセージキューを使用できることをご存知でしょう。セマフォを使用してその機能(共有データが変更されるまで待機)を実装するための良い方法は何ですか?
c - cのsemaphores.hとthreads.h
こんにちは、c のライブラリとインストールが必要です。Linux の ubuntu o/s を使用しています。インストール方法を知っている人はいますか?