2013-01-11 116 views
4

我正在嘗試使用谷歌測試/模擬來測試阻塞與異步。如何測試阻塞vs異步?

不幸的是,我很難想出一些測試來確保異步發生在第一種情況下並在第二種情況下阻塞。

有沒有一種方法可以確認std :: future的行爲方式應該如何?

CODE

#include <gtest/gtest.h> 
#include <future> 

static unsigned a_slow_calc() 
{ 
    sleep(1); 
    return 1u; 
} 

TEST(Test_future, Ensure_async) 
{ 
    // 1. immediately returns 
    std::future<unsigned> answer = std::async(a_slow_calc); 

    // 2. std::future::get BLOCKS until the result is ready 
    EXPECT_EQ(1u, answer.get()); 
} 

回答

1

你可能會在future使用wait_for,具有零超時(或非常小)和,看看它是否與價值future_status::timeout返回。

+0

+1 ty - 這是一個相當不錯的建議 - 事實上,我遵循鏈接並使用通過測試的超時工作。不幸的是,當我在測試中運行valgrind的drd時,我得到了競爭條件(這實際上是有道理的,因爲沒有線程和時鐘的保證)。 – kfmfe04

3

您應該使用std::launch::async啓動策略。您的第一個函數調用不保證立即返回,與您在其上面寫的評論相反。

默認策略是在這個或另一個線程上完成這項工作。您當前的代碼可以通過測試你的機器上但如果使用std::launch::async政策那麼你的測試基本測試C++ 11標準可能無法在客戶端計算機上...

。換句話說,你想測試的東西已經被標準保證了。

+0

+1 thx的提示:順便說一句,我明白這是標準的一部分,但是如果可能的話,我想通過測試進行驗證(特別是在gcc可能部分實現了新功能的前沿附近 - 之前已經被燒燬) 。 – kfmfe04

+0

很高興幫助,祝你好運! – Ali