启用整个程序优化后,是否允许编译器重新排序函数调用?(/GL 开关)
这不会破坏多线程环境中的代码吗?
考虑以下伪代码:
Thread1
{
  numbers.append( 1 );
  numbers.append( 2 );
  numbers.append( 3 );
  numbers.append( 1 );
  numbers.append( 2 );
  numbers.append( 3 );
  manager.signalFinished();
}
Thread2
{
  // is the compiler allowed to reorder the next two lines?
  bool isReady = manager.isFinished();
  int lastElem = numbers.getLastElement();
  if( 3 == lastElem )
  {
    if( isReady )
    {
      TerminateThread();
    }
    else
    {
      // go back to start
      continue;
    }
  }
}
我们总共有 2 个线程。
线程 1 会将数字放入列表中,一旦完成,就会触发一个信号,表明所有数字都在列表中。假设对于一个完整的列表,最后一个元素总是必须是3。
线程 2 将检查信号是否已设置以及最后一个元素是否为3.
假设所有函数都在不同的编译单元中,程序应该运行得很好。
如果整个程序优化将使编译器能够重新排序函数调用(或并行执行它们),则该程序很可能会被破坏。线程 2 的前两行似乎与编译器无关(它们不共享互斥体),而实际上它们在逻辑上是在更深层次上链接的。
重新排序可能会导致以下情况:
Thread1: numbers.append( 1 );
         numbers.append( 2 );
         numbers.append( 3 );
Thread2: int lastElem = numbers.getLastElement(); // is 3
Thread1: numbers.append( 1 );
         numbers.append( 2 );
         numbers.append( 3 );
         manager.signalFinished();
Thread2: bool isReady = manager.isFinished(); // is true
         // now TerminateThread would be invoked
         // and the second 1, 2, 3 of Thread1 would be lost