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 ) );