测量c ++多线程程序中的经过时间

时间:2014-02-09 09:06:12

标签: c++ multithreading time

我有一个用于C ++中跳棋游戏的AI Minimax代码。在这个程序中,主程序调用我在新线程中写入的函数,它在睡眠5秒后返回主程序

int flag = 0 ;
void execute(){
    hThread = ( HANDLE ) _beginthread( myfunction ) ;
    sleep( 5000 );

    if(flag == 1) // Do some work 
}


Outputval myfunction(...) {

   clock_t start = clock() ;
   while( double(clock() - start)/CLOCKS_PER_SEC < 4 ) {   //CLOCKS_PER_SEC = 1000

      //DO SOME WORK

   }
   flag = 1;
   return somevalue ;

}

我的问题是虽然在我的函数中完成的工作需要大约3-4秒,但是在每次迭代之后计算的时间是0-1秒的时间。因此,即使已经过了4秒并且未设置标志,myfunction中的循环也会继续运行 我也使用了time()函数 - 它给出了同样的问题。

1 个答案:

答案 0 :(得分:1)

不是答案,而是“谨慎”:

假设您的变量 flag 是全局的并且在两个线程中都可见。由于至少一个访问不是原子的(C ++ 11)或标志不是 volatile (C ++ 03),因此您的代码包含“数据竞争”,并且这将触发“未定义的行为”。未定义的行为为编译器打开了广泛的优化机会:

编译器将按如下方式优化您的代码:

从:

开始
int flag = 0 ;
void execute{
    hThread = ( HANDLE ) _beginthread( myfunction ) ;
    sleep( 5000 );

    if(flag == 1) // Do some work 
}

最终可能会创建此代码:

constexpr int flag = 0 ;
void execute{
    hThread = ( HANDLE ) _beginthread( myfunction ) ;
    sleep( 5000 );

    if(0) {}// Never do anything
}

您的代码也有其他问题。我建议完全重新设计。