내가 따르고있는 튜토리얼에서 작성자는 std::future
의 소멸자가 항상 작업을 실행하지 않는다는 것을 보여주는 프로그램을 작성했습니다. 다음 프로그램에서는 std::async()
으로 생성 된 10 개의 스레드가 벡터로 이동 한 다음 소멸자가 실행될 때까지 기다립니다. 일부 스레드가 지연되는 이유는 무엇입니까?
#include <iostream>
#include <future>
#include <thread>
#include <chrono>
int main()
{
std::cout << "Main thread id: " << std::this_thread::get_id() << std::endl;
std::vector<std::future<void>> futures;
for (int i = 0; i < 10; ++i)
{
auto fut = std::async([i]
{
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << std::this_thread::get_id() << " ";
});
futures.push_back(std::move(fut));
}
}
결과
기계에 의존하지만, 우리가 발견 한 것은 (우리는 메인 스레드 ID를 출력 한 후 인쇄 6 개 ID를 가지고) 소멸자가 실행 된 경우에만 6 스레드가 시작되었다이었다. 이것은 다른 4 개가 지연되고, 지연된 스레드가std::future
의 소멸자 중에 실행되지 않는다는 것을 의미합니다.
제 질문은 일부 스레드가 실행되는 동안 다른 스레드가 지연되는 이유입니다. std::future
의 수명이 끝나면 지연시키는 시점은 무엇입니까?
과부하 (코어/물리 스레드의 양이 너무 많은 스레드 만들기)는 모든 작업 전환이 관련되어 시스템 성능을 저하시킬 수 있습니다. – Borgleader
테스트 머신에는 몇 개의 코어/SMT 스레드가 있습니까? – inf
@bamboon 출력 내용이 내 컴퓨터가 아닌 자습서에 표시되었습니다. –