Another SO thread은 thread::native_handle
을 사용하여 C++ 스레딩 API 외부의 작업 (예 : 스레드의 우선 순위 설정)을 수행하는 방법을 설명합니다. 요지는 다음이 방법스폰 된 스레드가 스레드를 생성하기에 충분히 오래 걸리는 현상이 발생합니다.
std::thread t(functionToRun);
auto nh = t.native_handle());
// configure t using nh
문제는 functionToRun
는 t가 완료된 구성하는 코드 앞에 시간 (완료 포함)의 임의의 시간 동안 실행할 수있다.
나는 (테스트되지 않은) 우리는 다음과 같은 않게 만들 수 있습니다 생각 :
std::atomic<bool> configured(false);
std::thread t([&]{ while (!configured); // spin until configured is true
functionToRun(); });
auto nh = t.native_handle();
// configure t using nh
configured = true;
불행하게도,이 사실이 될 configured
기다리고 회전 할 수있는 산란 실을 야기한다. 생성 된 스레드는 구성이 완료 될 때까지 차단하는 것이 좋습니다. condvar이 일에 더 적합처럼 개념적으로, 보인다,
std::mutex m;
std::unique_lock<std::mutex> lock(m);
std::thread t([&]{ std::lock_guard<std::mutex> lg(m); // block until m available
functionToRun(); });
auto nh = t.native_handle();
// configure t using nh
lock.unlock(); // allow t to continue
작동해야처럼이 보인다 :하지만, 그것을 달성하기
한 가지 방법은 뮤텍스 (또한 테스트되지 않은)를 사용하는 것 같다 조건 (구성 완료)이 충족 될 때를 나타냅니다. 그러나 condvar를 사용하려면 위의 모든 내용과 condvar가 필요하며, 내가 아는 한 mutex에 대한 문제가 아닌 가짜 깨우기의 가능성을 처리해야합니다.
스레드를 생성 한 다음 즉시 중지하여 네이티브 핸들을 사용하여 더 이상 실행하기 전에 구성 할 수있는 더 좋은 방법이 있습니까?
생성 된 스레드 대신 생성 된 스레드 ('functionToRun()')에서 대기를 수행하는 것이 더 합리적이지 않습니까? 즉, spawner가 "구성 완료, 진행"신호를 보낼 때까지 그냥 스폰 된 스레드가 잠자기 상태가됩니까? – DevSolar
@DevSolar : 코드가하는 일입니다. 산란 스레드는 뮤텍스를 잡아서, 산란 된 스레드가이를 얻으려고 할 때 차단합니다. 스폰 스레드가 뮤텍스를 잠금 해제하면 (구성 완료를 나타냄) 생성 된 스레드가 계속 될 수 있습니다. 스폰 된 함수는 functionToRun이 아니며 functionToRun을 호출하는 람다 생성 closure입니다. – KnowItAllWannabe