Все
Я настроил тестовый проект для изучения std :: future и его использования с std :: async. Это простое консольное приложение и код выглядит следующим образом
#include <iostream>
#include <future>
#include <string>
using namespace std;
std::string getLine()
{
char rawLine[1024];
std::cin.getline(rawLine, 1024);
std::string line(rawLine);
return line;
}
int main(int argc, char *argv[])
{
std::string line("");
while ((line != "@shutdown"))
{
std::future<std::string> future = std::async(getLine);
if (future.wait_for(std::chrono::seconds(30)) == std::future_status::ready)
line = future.get();
else
{
future._Abandon();
std::cout << "@:-- server shutdown\n";
break;
}
}
return 0;
}
Я заметил странное поведение с Visual Studion 2017. Если я устанавливаю свойства проекта-> Генерация кода-> Библиотека времени выполнения на / MTd или / MT, эта программа зависает при выходе, и стек вызовов показывает
> futrreAsyncTest.exe!_execute_onexit_table::__l2::<lambda>() Line 206 C++ Symbols loaded.
futrreAsyncTest.exe!__crt_seh_guarded_call<int>::operator()<void <lambda>(void),int <lambda>(void) &,void <lambda>(void) >(__acrt_lock_and_call::__l2::void <lambda>(void) && setup, _execute_onexit_table::__l2::int <lambda>(void) & action, __acrt_lock_and_call::__l2::void <lambda>(void) && cleanup) Line 204 C++ Symbols loaded.
futrreAsyncTest.exe!__acrt_lock_and_call<int <lambda>(void) >(const __acrt_lock_id lock_id, _execute_onexit_table::__l2::int <lambda>(void) && action) Line 940 C++ Symbols loaded.
futrreAsyncTest.exe!_execute_onexit_table(_onexit_table_t * table) Line 160 C++ Symbols loaded.
futrreAsyncTest.exe!common_exit::__l2::<lambda>() Line 226 C++ Symbols loaded.
futrreAsyncTest.exe!__crt_seh_guarded_call<void>::operator()<void <lambda>(void),void <lambda>(void) &,void <lambda>(void) >(__acrt_lock_and_call::__l2::void <lambda>(void) && setup, common_exit::__l2::void <lambda>(void) & action, __acrt_lock_and_call::__l2::void <lambda>(void) && cleanup) Line 225 C++ Symbols loaded.
futrreAsyncTest.exe!__acrt_lock_and_call<void <lambda>(void) >(const __acrt_lock_id lock_id, common_exit::__l2::void <lambda>(void) && action) Line 940 C++ Symbols loaded.
futrreAsyncTest.exe!common_exit(const int return_code, const _crt_exit_cleanup_mode cleanup_mode, const _crt_exit_return_mode return_mode) Line 201 C++ Symbols loaded.
futrreAsyncTest.exe!exit(int return_code) Line 293 C++ Symbols loaded.function 0x00d9f750 {futrreAsyncTest.exe!Concurrency::details::`anonymous namespace'::`dynamic atexit destructor for '_Task_scheduler_main_block_instance''(void)} void(*)()
С другой стороны, если я установлю свойства проекта-> генерация кода-> библиотека времени выполнения на / MD или / MDd, эта программа нормально завершится.
Есть идеи, почему это может происходить? Ценю любую помощь, спасибо!
Задача ещё не решена.
Других решений пока нет …