問題タブ [condition-variable]

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

c++ - クラスのさまざまなインスタンス間でミューテックスをどのように共有しますか?

あるクラスのミューテックスを別のクラスの異なるインスタンス間で共有する方法を考えていました。

現在、プライベートメンバー変数としてBoostmutexとcondition_variableを持つクラスIndexerがあります。メインにIndexerクラスのauto_ptrを作成し、Indexerのポインターを別のクラスRobotのインスタンスに渡します。

私は次のようにそれを行います:

ロボットのコンストラクターは次のとおりです。

ロボットのヘッダーは次のようになります。

ただし、ミューテックスはコピーできないため、エラーが発生します。

mutexとcondition_variableshared_ptrsを作成することを考えていましたが、これにより予期しない動作が発生する可能性があることを読みました。

誰かがこれを行うための適切な/正しい方法を教えてもらえますか?

ありがとうございました!

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

multithreading - 条件変数が必要なのはいつですか、ミューテックスでは不十分ですか?

条件変数の概念が存在する理由は、ミューテックスだけでは不十分だと確信しています。しかし、それは私を打ち負かし、条件変数が不可欠である場合、具体的なシナリオで自分自身を納得させることができません。

条件変数、ミューテックス、およびロックの質問の受け入れられた回答の違いは、条件変数が

「シグナリング」メカニズムでロックします。これは、スレッドがリソースが使用可能になるのを待つ必要がある場合に使用されます。スレッドはCVで「待機」でき、リソースプロデューサーは変数を「通知」できます。この場合、CVを待機しているスレッドは通知を受け取り、実行を続行できます。

私が混乱しているのは、スレッドがミューテックスを待機することもできるということです。スレッドがシグナルを送信されたとき、それは単に変数が使用可能になったことを意味します。なぜ条件変数が必要なのですか?

PS:また、条件変数の目的が見えないように私のビジョンをより斜めにするときは、とにかく条件変数を保護するためにミューテックスが必要です。

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

c - CのBossWorkerPthreads Webサーバー-スレッドの数よりも多くのリクエストが送信されると、サーバーがクラッシュします

私はPthreads(私はさらに多くを吸う)を使用してC(私が吸う)でWebサーバーを書いています、そして私はこの時点で立ち往生しています。サーバーのモデルはboss-workerであるため、ボススレッドはプログラムの開始時にすべてのワーカースレッドをインスタンス化します。着信接続のソケットを格納するグローバルキューがあります。ボススレッドは、接続が受け入れられるときにすべてのアイテム(ソケット)をキューに追加するスレッドです。次に、すべてのワーカースレッドは、アイテムがグローバルキューに追加されるのを待って、処理を開始します。

サーバーに接続する回数がサーバーのワーカースレッドの数より少ない限り、サーバーは正常に動作します。そのため、ミューテックスに問題があるか(シグナルが失われている可能性がありますか?)、スレッドが1回実行された後に無効になっていると思います(8つのスレッドがある場合、最初のスレッドしか解析できない理由を説明します) 8つのhttpリクエスト)。

これが私のグローバルキュー変数です。

これがメインスレッドです。enqueue、dequeue、emptyなどのメソッドを使用してキュー構造体(他の場所で定義)を作成します。サーバーが接続を受け入れると、着信接続がオンになっているソケットをエンキューします。最初にディスパッチされたワーカースレッドは、このキューを常にチェックして、ジョブが追加されているかどうかを確認します。ジョブがある場合は、ソケットをデキューし、そのポートに接続して、着信httpリクエストの読み取り/解析/書き込みを行います。 。

これがワーカースレッドです。これは常に新しいリクエストのチェックを実行している必要があります(キューが空でないかどうかを確認することによって)。このメソッドの最後では、ボススレッドに戻って、次に必要になるまで待機する必要があります。

どんな助けでも大歓迎です。誰かがそれを必要とするならば、私はもっと多くのコードを投稿することができます、ただ私に知らせてください。私はOSのこと、特にCのことは得意ではありませんが、ミューテックスの基本は知っています。変数、セマフォなど。私が言ったように、私は私が得ることができるすべての助けを借ります。(また、これが私の最初の質問なので、コードを正確に投稿したかどうかはわかりません。読みやすくするためにフォーマットを変更する必要があるかどうかをお知らせください。)

ありがとう!

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

c - pthread_cond_wait() がブロックを解除する前に pthread_mutex_lock() をブロック解除できますか?

条件変数のスレッド ブロックを想像してください。

ミューテックスがロック解除され、ミューテックスをロックしようとしている別のスレッドのブロックが解除されます。

同時に、クリティカル セクションの所有権を取得するために待機している別のスレッドがあります。

ここでの問題は、pthread_cond_signal() が呼び出されたとき、pthread_cond_wait() [1] が pthread_mutex_lock() [2] の前にブロック解除されることが保証されているかどうかです。

POSIX仕様は、ケースについて何も言っていないようです。

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

windows - Windowsでの再帰的ミューテックス?

私が理解している限り、WindowsではCRITICAL_SECTIONは非再帰的ミューテックスとしてのみ使用できます。再帰的ミューテックスを取得するには、OpenMutexとその仲間を使用する必要があります。

ただし、AFAIU、Win32 Mutexは条件変数(InitializeConditionVariable et al。)では使用できません。

Windowsで条件変数と組み合わせて再帰ミューテックスを使用する方法はありますか?

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

c++ - boost :: condition_variable :: notify_one()での同時実行

タスクを非同期的に処理する「エンジン」があり、1つのタスクについて、そのタスクが処理されるまで待機したいと思います。

問題は、上記のコードに競合状態があることです。前にそれを待つようにDoWorkAsync()通知した場合はどうなりますか?boost::condition_variableDoSomeWork()

boost::condition_variable::waitこれには2番目のパラメーター、このようなものを実装するために使用できるブール値があることがわかります

しかし、並行性はまだあります...どうすればこれを解決できますか?

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

c++ - 2 つのミューテックスに関連付けられた 1 つの条件変数を (個別に) 使用してもよいですか?

2種類のデータ更新に、2つのミューテックスに関連付けられた1つの条件変数を使用してもいいですか。

基本的に、スレッド1とスレッド2があります。Thread1 は 2 種類のデータ更新を待機できるため、それぞれに 1 つずつ、2 つのミューテックスを取得しました。(これらすべてのデータに対して 1 つのミューテックスを使用できることはわかっていますが、これはこの質問のポイントではありませんよね?) そして、data2 が既に利用可能である間に data1 を待機させたくないので、条件変数は 1 つしか取得しませんでした。 . また、thread2 は data1 と data2 の両方を提供します。問題は、thread2 では、thread1 が現在 data1 または data2 を待機しているか、まったく待機していないかがわからないことです。

擬似コードは次のようになります。

外部は func1 または func2 を呼び出してデータを更新します。func1 または func2 が呼び出されると、lock1 または lock2 にあるかどうかに関係なく、cond_var が通知されます。cond_var の待機は while で囲まれていないため、cond_var が lock1 で起こされたが data2 が使用可能な場合、thread1 は data2 の処理に進みます。

実際の実装はboost::threadを介しており、私のテストのプラットフォームはLinuxなので、boost::threadはpthreadを介して実装する必要があります。

条件変数について読んだほとんどすべてのチュートリアルとドキュメントでは、1 つのミューテックスのみに関連付けられています。したがって、上記のプログラムが使用しても問題ないのか、それとも根本的に欠陥があるのか​​知りたいです。

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

c++ - 条件変数でnotifyを呼び出すと、ミューテックスのロックが解除されますか?

ミューテックスを条件変数で使用するとどうなるかを理解しようとしています。

次の例では、cppreferenceから取得

cond_var.notify_one()ミューテックスのロックが解除される前に、プロデューサースレッドが呼び出します。通知が呼び出されたときにミューテックスのロックが解除されますかm、それともミューテックスのロックが解除されたときにのみ通知が発生しますか?

0 投票する
4 に答える
10964 参照

c++ - std::condition_variable::wait_for と std::condition_variable::wait_until の違いは何ですか?

私が使用している参考文献は、次のように2つを説明しています。

  • wait_for「条件変数が起動されるか、指定されたタイムアウト期間が経過するまで、現在のスレッドをブロックします」

  • wait_until「条件変数が起動されるか、指定された時点に到達するまで、現在のスレッドをブロックします」

違いはなんですか?wait_untilシグナルが送信されたときにスレッドが正確に (多かれ少なかれ) 続行できるようにスピンしますが、wait_forその時点でスレッドをスケジューリングに戻すだけですか?

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

multithreading - 複数のスレッドが、メソッドの使用が許可されているのは 1 つだけです

つまり、基本的に私が置かれている状況は、1 週間を通してそれぞれが異なる計算を行う多数のスレッドを持っているということです。週の終わりに、すべてのスレッドが関数 X() を呼び出し、次の週の計算を開始して、このサイクルを繰り返します。

ただし、メソッド X() で実際に操作を実行できるスレッドは 1 つだけであり、すべてのスレッドがメソッド X() に到達した場合に限られます。さらに、メソッド X() を使用するようになった 1 つのスレッドが終了するまで、どのスレッドも途中で続行することはできません。

だから私はこれを実装するのに苦労しています。条件変数を使用する必要があるように感じますが、スレッドなどでまだ不安定です。