Я пытаюсь проверить блокировку vs async с помощью google test / 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() );
}
Вы должны использовать std::launch::async
политика запуска. Ваш первый вызов функции не гарантированно вернется сразу же вопреки комментарию, который вы написали выше.
Политика по умолчанию — выполнять работу в этом или другом потоке. Ваш текущий код может пройти тест на твоей машине но может произойти сбой на компьютере клиента …
Если вы используете std::launch::async
политика, то ваш тест в основном тестирует стандарт C ++ 11. Другими словами, то, что вы хотите проверить, уже гарантировано стандартом.
Вы могли бы использовать wait_for
на future
с нулевым тайм-аутом (или очень маленьким) и посмотреть, вернется ли он со значением future_status::timeout
,