私はvalgrindでマルチスレッドソケットプログラムを実行しています。クライアントはTCP経由でサーバーに要求を送信し、ブール値でビジー状態を待機します。ブール値は、サーバーからの応答を処理するコールバック関数が呼び出されたときに設定されます。応答が受信されると(ブーリアンフラグが設定されると)、サーバーは要求を再度送信し、これをループで繰り返し実行します。valgrindはマルチスレッドソケットプログラムで停止します
共有変数(ブール値)への非暗号化アクセスがスレッドの問題を引き起こす可能性があることに気づきましたが、pthread mutexを使用しようとしましたが、プログラムの速度は約20%遅くなります。私は共有ブール変数への書き込みは、1回のサイクルで行うことができるので大丈夫だと確信しています。
プログラムはvalgrindの外側で正常に動作しますが、valgrindで実行すると停止することがよくあります。私はプログラムを一晩中実行したままにしておきました。通常は完了するまでに数秒かかりますので、プログラムが終了するのに十分長い間待機していないと思いません。スレッドはオープンソースのエンジンフレームワーク(クイックフィックス)によって管理されているので、スレッドの作成/管理方法に問題はないとは思いません。
マルチスレッドプログラム/ビジーウェイトループ/ソケット通信(またはこれらの組み合わせ)に関するvalgrindの問題を知っている人はいますか?
共有ブール変数のビジー待機は、「1サイクルで完了」ではなく、ループごとに複数のサイクルで実行されます。ビジーループがネットワーク上のTCP往復で待機している場合、ループが数十億回繰り返される可能性があります(したがって、他の場所で使用されている可能性がある数十億のCPUサイクルを無駄にする)。あなたが言及したことのいずれかより良い解決策は、条件変数を待つことであり、コールバック関数が条件変数を通知して、データが準備できたらスレッドを起動させます。 –
私はブール変数への書き込みが1サイクル(ビジー待機プロセス全体ではない)で行われると述べました。私はブール変数への書き込みが原子的に行われていると述べていたはずです(キャッシュミスなどが単一のCPUサイクルを過ぎて1バイトの書き込みをプッシュできるため) – Taras
Jeremyが言ったこと - ビジー状態は悪い考えです。 – BillT