gpt4 book ai didi

c++ - 在 C++ 多线程程序中测量耗时

转载 作者:行者123 更新时间:2023-11-28 07:06:52 27 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于c++ - 在 C++ 多线程程序中测量耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21657217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com