测量 C++ 多线程程序中的运行时间

measure elapsed time in c++ multithreaded program

本文关键字:运行时间 程序 C++ 多线程 测量      更新时间:2023-10-16

我有一个用于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() 函数 - 它给出了同样的问题。

不是答案,而是"警告":

假设您的变量标志是全局的并且在两个线程中都可见。由于至少一个访问不是原子的(C++11)或标志不是易失性的(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
}

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