2014-02-09 60 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 
} 

您的代碼還有其他問題。我建議徹底重新設計。