首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >测量c++多线程程序中的运行时间

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

Stack Overflow用户
提问于 2014-02-09 09:06:11
回答 1查看 900关注 0票数 0

我有一个AI Minimax代码在C++中的棋盘游戏。在这个过程中,主程序调用我在一个新线程中编写的函数,而它休眠了5秒,然后返回到主程序。

代码语言:javascript
运行
复制
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秒,并且没有设置标志,我也使用了time()函数--它也给出了同样的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-09 10:02:44

不是回答,而是“警告”:

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

编译器将按以下方式优化代码:

首先:

代码语言:javascript
运行
复制
int flag = 0 ;
void execute{
    hThread = ( HANDLE ) _beginthread( myfunction ) ;
    sleep( 5000 );

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

它可能最终会创建以下代码:

代码语言:javascript
运行
复制
constexpr int flag = 0 ;
void execute{
    hThread = ( HANDLE ) _beginthread( myfunction ) ;
    sleep( 5000 );

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

您的代码还存在其他问题。我建议彻底重新设计。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21657217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档