0

プログラムの最適化中にコンパイラが無限ループを生成する方法のデモを行う必要があります。

Visual Studio 2010 の C++ で表示する必要がありますが、揮発性の有無にかかわらず表示するのが最善の方法だと思います。

ここからコードを使用しましたhttp://msdn.microsoft.com/en-us/library/12a04hfd%28v=vs.80%29.aspx 揮発性の有無にかかわらず試してみました(およびコンパイル: /EHsc /O2)しかし、無限ループはありません。私もそのように変更します:

// compile with: /EHsc /O2

#include <iostream>
#include <windows.h>
using namespace std;

//volatile bool Sentinel = true;
bool Sentinel = true;
int CriticalData = 0;
int round=0;

unsigned ThreadFunc1() {
   while (Sentinel){
        Sleep(10);   // volatile spin lock   
        cout << "Critical Data = " << CriticalData << endl; 
   }
   return 0;
} 
unsigned  ThreadFunc2() {
   Sleep(2000);
   CriticalData++; 
   Sentinel = false; 
   return 0;
}

int main() {
   HANDLE hThread1, hThread2; 

   hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadFunc1, NULL, 0, NULL);
   hThread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadFunc2, NULL, 0, NULL);

   CloseHandle(hThread1);
   CloseHandle(hThread2);

   system("pause");
} 

しかし、無限ループはありません。誰かがアイデアを持っていますか?

4

3 に答える 3

1

コンパイラは、グローバル変数で何を実行できるかを確実に認識していません。(その観点から)変数を変更できる可能性があるため、コンパイラはループからの読み取りを削除できません。Sleep(int)iostream.operator <<()SentinelSentinel

于 2012-06-11T17:12:11.930 に答える
0

ここでの問題は何ですか?コンパイラー、揮発性のない無限ループを生成する場合がありますが、そうである必要はありません。最高の最適化レベルでコンパイルし、デバッグ情報をオフにすると、無限ループが発生する可能性が高くなります。

于 2012-06-11T15:57:16.973 に答える
0
int gIMightBeUseful = 1;

void foo()
{
  int bar;
  while(!bar){gIMightBeUseful++;}
}

最適化レベルによっては無限ループの可能性があります。それとも、スレッドインターロック固有である必要がありますか?

于 2012-06-11T16:00:46.683 に答える