当启用整个程序优化时,MSVC 2010会重新排序函数调用吗?

时间:2013-10-15 13:57:35

标签: c++ multithreading visual-c++ compiler-optimization

在启用整个程序优化时,是否允许编译器重新排序函数调用? (/ 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

0 个答案:

没有答案