2014-02-09 66 views
0

我有一个用于C++跳棋游戏的AI Minimax代码。在这方面,主程序调用,我已经写在一个新的线程,而它休眠5秒后,它返回到主程序在C++多线程程序中测量已用时间

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

如果不执行()工作,** **执行**吗?什么是CLOCKS_PER_SEC定义为?使用time_t会更简单吗?它会以秒为单位返回时间? – cup

+3

我不认为你的设计非常好。不保证myfunction()将在主线程的睡眠终止之前完成其工作。无论如何,你试图实现什么?产生新线程来执行工作是否有真正的理由?如果你的主线程忙于做其他事情,那将是有意义的,但就目前而言,除了等待外,其他任何事情都没有做过。此外,您应该尝试使用信号量或互斥量而不是标志,因为它们更安全,超时可能是等待函数中固有的。 –

+0

这就是我使用循环的原因。我必须在myfunction()中确保它在主线程终止睡眠之前返回。执行函数execute我不能改变,因为它来自其他团队,必须按原样使用。我可以修改的唯一东西是myfunction()。 – user3289221

回答

1

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

假设你的变量标志是全球性的,并可见两个线程。由于至少有一个访问不是原子的(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 
} 

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