При использовании future
вы не уверены на 100%, что создан новый поток. Например, когда вы создаете future
с использованием политики выполнения std::launch::deferred
, выполнение очень последовательное.
Цитирование стандарта:
std::launch::deferred
: задачавыполняется в вызывающем потоке при первом запросе его результата (ленивая оценка)
На практике, когда вы создаете future
с политикой выполнения std::launch::async
большую часть времени, новыйпоток запущен. Изучив сгенерированный код с помощью gcc 10
, я ясно вижу, что thread::join
называется:
std::__future_base::_Async_state_commonV2::_M_complete_async():
pushq %rbp
movq %rsp, %rbp
//more assembly maddness
call std::__future_base::_Async_state_commonV2::_M_join()
, что, в свою очередь, приводит к вызову thread::join()
.
std::__future_base::_Async_state_commonV2::_M_join():
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp
movq %rdi, -40(%rbp)
movq -40(%rbp), %rcx
addq $32, %rcx
movq %rcx, -24(%rbp)
movl $std::thread::join(), %eax
...