1

C++クラスに少し問題があります...
プライベートメンバーがいbool clientConnectedます。
とゲッターbool isClientConnected() {return clientConnected;}

ここで問題となるのは、clientConnectedが別のスレッドから設定されていることです。

主に私はループを持っています

while (!x.isClientConnected())
{}

デバッグ構成でコンパイルすると、
すべて正常に動作します...clientConnectedがtrueに設定されるとすぐに終了します。
しかし、リリース構成でコンパイルすると。
コンパイラーは、ループを定数として最適化します。
そして次のようになります:

00141C01  cmp         al,bl  
00141C03  je          SDL_main+0A1h (141C01h)  

alの値は二度と更新されません。
だからそれはいつもそれを間違っていると思います。
私も揮発性の同じ結果で試しました

クラスでこの最適化を防ぐにはどうすればよいですか。次のような記述をしなくても、呼び出しごとに値が更新されます。

bool z = x.isClientConnected();
while (!z) { z = x.isClientConnected(); }
4

3 に答える 3

4

トレッドの問題については、あるスレッドから別のスレッドへの変更の伝播を保証するために、スレッド同期を使用する必要があります。

C++11 はスレッド化を直接サポートしていますが、私はそれを使用していません。

それをサポートするコンパイラがない場合は、Boost スレッドを試してください。

于 2012-10-13T14:08:46.740 に答える
3

volatile http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspxは、問題に対する簡単な答えのように見えます。

「揮発性として宣言されたオブジェクトは、値がいつでも変更される可能性があるため、特定の最適化では使用されません。」

volatile bool clientConnected;
bool isClientConnected() const volatile {return clientConnected;}

しかし-CPUを使用するループがあります:

while (!x.isClientConnected())
{}

セマフォで待機することをお勧めします。

x.waitForConnected();
void X::waitForConnected()
{
   WaitForSingleObject(m_connectedSemaphore, ,....);
}

MS Windows でセマフォを作成/使用する方法については、http: //msdn.microsoft.com/en-us/library/windows/desktop/ms686946 (v=vs.85).aspx を参照してください。

于 2012-10-13T14:12:50.317 に答える
0

ソース ファイル内のメソッドの実装を移動することでコンパイラを騙し、強制的にインライン化しないようにすることができます (コンパイラの特定の構文を調べてください)。

于 2012-10-13T14:02:39.923 に答える