Google tests и повисшие фьючуры

Есть простой тест, запускает 2 потока и ждёт их завершения. Соответственно хочется добавить таймаут на зависшие потоки.

auto handle_server = std::async(std::launch::async,
    TestServer,
    private_key,
    data,
    make_shared<NCryptSymIdea>()
);

auto handle_client = std::async(std::launch::async,
    TestClient,
    public_key,
    data,
    make_shared<NCryptSymIdea>()
);

auto start_time = chrono::high_resolution_clock::now();

auto status_server = handle_server.wait_for(chrono::milliseconds(milliseconds_timeout) - (chrono::high_resolution_clock::now() - start_time));
auto status_client = handle_client.wait_for(chrono::milliseconds(milliseconds_timeout) - (chrono::high_resolution_clock::now() - start_time));

ASSERT_TRUE(status_server == future_status::ready);
ASSERT_TRUE(status_client == future_status::ready);

Но вот тест не завершается по таймауту так как пытается убить повисшую фьючуру. Как заставить тест закончится с фейлом по окончанию таймаута?


Ответы (1 шт):

Автор решения: Chorkov

Возможно, поможет велосипед:

template< typename T >
void grable_future(  std::future<T>&& f )
{
    struct Impl
    {
        std::vector< std::future<T> > collection;
        ~Impl()
        {
            for(auto& f : collection)
                if(f.wait_for(std::chrono::seconds(0))!=std::future_status::ready)
                {
                    std::cerr<<"Error: Not all futures are ready at exit time."<<std::endl;
                    std::exit(1);
                }
        }

    } static impl;
    impl.collection.push_back( std::move( f ) );
}

Посланные в мусорницу future будут продолжать крутиться. (Можно будет выполнять другие тесты, поскольку из процедуры мы сможем выти.л) Если потоки не закончаться к моменту деструкции статических переменных, то будет вызван exit. (Можно пределать на abort/terminate.)

Использование:

 ...
 grable_future( std::move( handle_server ) );
 grable_future( std::move( handle_client ) );
→ Ссылка