4

我正在尝试使用谷歌测试/模拟测试阻塞与异步。

不幸的是,我在想出某种测试来确保异步在第一种情况下发生并在第二种情况下阻塞时遇到了麻烦。

有没有办法确认 std::future 的行为方式应有尽有?

代码

#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() );
}
4

2 回答 2

3

您应该使用 std::launch::async 启动策略。与您在上面写的评论相反,不能保证您的第一个函数调用立即返回。

默认策略是在此线程或另一个线程上执行工作。您当前的代码可能会在您的机器上通过测试,但在客户端的机器上可能会失败......

如果您使用该std::launch::async策略,那么您的测试基本上是在测试 C++11 标准。换句话说,您希望测试的内容已经得到标准的保证。

于 2013-01-11T08:43:11.643 回答
1

您可以wait_forfuture, 上使用零超时(或非常小),并查看它是否返回值future_status::timeout.

于 2013-01-11T08:29:31.870 回答