如何测试阻塞和异步?(涉及IT技术,是一个提问标题)

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() );
}
2个回答

3
你应该使用 std::launch::async 启动策略。与你在上面注释中写的相反,第一个函数调用不保证立即返回。
默认策略是在这个线程上或另一个线程上执行工作。你当前的代码可能在你的机器上通过测试,但可能在客户机上失败...
如果你使用 std::launch::async 策略,则你的测试基本上是测试 C++11 标准。换句话说,你想要测试的已经被标准保证了。

+1 谢谢你的提示:顺便说一下,我知道那是标准的一部分,但如果可能的话,我想通过测试来验证(特别是在接近前沿的地方,gcc 可能只部分实现了一个新功能 - 以前曾经被烧过)。 - kfmfe04

1
你可以在 future 上使用 wait_for,设置为零超时时间(或非常小),并查看它是否返回值 future_status::timeout

+1 谢谢 - 这是一个非常好的建议 - 实际上,我按照链接并使用超时编写了一个示例,该示例通过了测试。不幸的是,当我在测试中运行valgrind的drd时,我遇到了竞争条件(这实际上是有道理的,因为线程和时钟没有任何保证)。 - kfmfe04

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接