我有一个用于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()函数 - 它给出了同样的问题。
答案 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
}
您的代码也有其他问题。我建议完全重新设计。