Как проверить на блокировку vs async?

Я пытаюсь проверить блокировку 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() );
}

4

Решение

Вы должны использовать std::launch::async политика запуска. Ваш первый вызов функции не гарантированно вернется сразу же вопреки комментарию, который вы написали выше.

Политика по умолчанию — выполнять работу в этом или другом потоке. Ваш текущий код может пройти тест на твоей машине но может произойти сбой на компьютере клиента …

Если вы используете std::launch::async политика, то ваш тест в основном тестирует стандарт C ++ 11. Другими словами, то, что вы хотите проверить, уже гарантировано стандартом.

3

Другие решения

Вы могли бы использовать wait_for на futureс нулевым тайм-аутом (или очень маленьким) и посмотреть, вернется ли он со значением future_status::timeout,

1

По вопросам рекламы [email protected]