我有一个AI Minimax代码在C++中的棋盘游戏。在这个过程中,主程序调用我在一个新线程中编写的函数,而它休眠了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秒,并且没有设置标志,我也使用了time()函数--它也给出了同样的问题。
发布于 2014-02-09 10:02:44
不是回答,而是“警告”:
假设变量标志是全局的,并且在两个线程中都是可见的。由于至少有一个访问不是原子访问(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
}
您的代码还存在其他问题。我建议彻底重新设计。
https://stackoverflow.com/questions/21657217
复制相似问题