C++ 如何测试阻塞与异步?

C++ 如何测试阻塞与异步?,c++,testing,stl,c++11,future,C++,Testing,Stl,C++11,Future,我正在尝试使用googletest/mock测试阻塞与异步 不幸的是,我很难想出某种测试来确保异步在第一种情况下发生,而阻塞在第二种情况下发生 有没有一种方法可以确认std::future的行为方式是正确的 代码 #include <gtest/gtest.h> #include <future> static unsigned a_slow_calc() { sleep( 1 ); return 1u; } TEST( Test_future, Ensure

我正在尝试使用googletest/mock测试阻塞与异步

不幸的是,我很难想出某种测试来确保异步在第一种情况下发生,而阻塞在第二种情况下发生

有没有一种方法可以确认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() );
}
#包括
#包括
静态无符号a_slow_calc()
{
睡眠(1);
返回1u;
}
测试(测试未来,确保异步)
{
//1.立即返回
std::future answer=std::async(慢计算);
//2.std::future::get块,直到结果准备就绪
EXPECT_EQ(1u,answer.get());
}

您可以在
未来使用
,超时时间为零(或非常小)并查看它是否返回值
future\u status::timeout
您应该使用
std::launch::async
启动策略。您的第一个函数调用不能保证立即返回与您在上面写的注释相反的结果

默认策略是在此线程或其他线程上执行工作。您当前的代码可能在您的计算机上通过测试,但在客户端的计算机上可能失败


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

+1 thx提示:顺便说一句,我理解这是标准的一部分,但如果可能,我想通过测试进行验证(特别是在最前沿的地方,gcc可能已经部分实现了一项新功能-之前已被烧毁).1 ty-这是一个非常好的建议-事实上,我遵循了链接,并使用了一个通过测试的超时示例。不幸的是,当我在测试中运行valgrind的drd时,我得到了一个竞争条件(这实际上是有意义的,因为线程和时钟没有保证)。