2012-06-25 2 views
2

Another SO threadthread::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에 대한 문제가 아닌 가짜 깨우기의 가능성을 처리해야합니다.

스레드를 생성 한 다음 즉시 중지하여 네이티브 핸들을 사용하여 더 이상 실행하기 전에 구성 할 수있는 더 좋은 방법이 있습니까?

+1

생성 된 스레드 대신 생성 된 스레드 ('functionToRun()')에서 대기를 수행하는 것이 더 합리적이지 않습니까? 즉, spawner가 "구성 완료, 진행"신호를 보낼 때까지 그냥 스폰 된 스레드가 잠자기 상태가됩니까? – DevSolar

+2

@DevSolar : 코드가하는 일입니다. 산란 스레드는 뮤텍스를 잡아서, 산란 된 스레드가이를 얻으려고 할 때 차단합니다. 스폰 스레드가 뮤텍스를 잠금 해제하면 (구성 완료를 나타냄) 생성 된 스레드가 계속 될 수 있습니다. 스폰 된 함수는 functionToRun이 아니며 functionToRun을 호출하는 람다 생성 closure입니다. – KnowItAllWannabe

답변

7

일부 외부 구성이 완료 될 때까지 스레드의 주 기능 시작을 지연시키고 자 할 때 나는 미래를 사용합니다. 이것은 스핀 대기를 피하고 mutex 나 condvar와 동일한 차단 속성을 갖지만 명확한 의도를 제공합니다. 나는 특히 --- 멀티 스레드 테스트를위한 shared_future으로이 방법이 패턴을 사용하는 것과 같이 모든 스레드를 실행하고 테스트가 시작되기 전에 갈 준비가되어 있는지 확인 할 수

std::promise<void> p; 
std::thread t([&p]{ 
    p.get_future().wait(); 
    thread_func(); 
} 

auto nh=t.native_handle(); 
// configure nh 
p.set_value(); 

:로이 패턴을 사용하여, 당신은 당신의 예를 작성할 수 있습니다.

관련 문제