0

まず、この質問が既にどこかにある場合は申し訳ありませんが、私の Google のスキルでは不十分なようです。

基本的に、受信メッセージをいつでもチェックする機能があります。このメッセージを格納するグローバル変数もあります。(私はこの関数をスレッドに入れました)

次のようなものを使用して受信メッセージを確認したい:

while (global_array[0] != '#') { } // all messages are padded with '#'

残念ながら、これは機能していないようです。

これを ' ' 揮発性にしようとしましglobal_arrayたが、受信に使用している TCP 機能とうまくいきません。

私は本当にこれが機能する必要があります..助けていただければ幸いです。

編集:「機能していないようです」->このループに陥っているため、変数が変更されていないようです

4

1 に答える 1

3

スレッド間で通信する場合、何らかの形式の同期が必要です。変数を作成することは、この変数が異なるスレッド間で使用されることを示す手段でvolatileはありません。コンパイラがこの変数へのアクセスを最適化するのを防ぐだけですが、CPU は、指示しない限り、キャッシュ以外の場所からメモリの内容の読み取りを開始しません。つまり、使用するとコードが遅くなるだけです (はい、一部のプラットフォームでは、コンパイラの実装者がマルチスレッド プリミティブを使用するvolatileことを選択していることは知っていますが、そうすることは一般的に悪い考えと見なされます)。volatile

あなたが説明する目的のために、共有データへのアクセスを保護する条件変数を使用したいと考えています。

  1. 読み取りスレッドは、同時アクセスを保護するミューテックスをロックし、global_arrayデータが存在するまで条件変数を待機し続けます。
  2. 書き込みスレッドはミューテックスをロックし、そこにデータを入れ、ミューテックスをロック解除し、条件変数にシグナルを送ります。

Boostには同様の機能をカプセル化したクラスがあり、異なるスレッド間で通信するためのキューのコードが Stackoverflow に投稿されていると確信しています。Google で「スレッド コミュニケーション キュー」を検索すると、インスピレーションを得るためのリンクがたくさん見つかります。

于 2012-11-04T13:21:57.993 に答える