2012-10-10 1 views
1

DCPU-16 에뮬레이터를 작성하고 있으며이 함수를 호출하는 스레드를 실행하여 CPU의 실시간 클럭 속도를 계산하고 있습니다. getRealTimeCPUClock()는 별도의 스레드에 있습니다. 문제는 미래 객체의 "유효한"속성이 값을 반환하지 않은 경우에도 true라는 것입니다. 결과적으로 futureObj.get()을 호출하면 getRealTimeCPUClock()이 리턴 될 때까지 대기합니다.std :: async는 std :: launch :: async로 스레드를 생성하지 않는 것 같습니다.

실행 정책이 async (지연과 반대) 인 경우 백그라운드로 함수를 시작한 다음 유효한 속성을 true로 설정하면 되나요?

잘못된 사용입니까?

int getRealTimeCPUClock() { 
    int cyclesBeforeTimer = totalCycles; 
    sleep(1); 

    return totalCycles - cyclesBeforeTimer; 
} 

void startExecutionOfProgram(char *programFileName) 
{ 
    size_t lengthOfProgramInWords = loadProgramIntoRAM(programFileName); 
    auto futureRealTimeClockSpeed = std::async(std::launch::async, getRealTimeCPUClock); 

    while(programCounter < lengthOfProgramInWords) { 

     if(futureRealTimeClockSpeed.valid()) { 
      realTimeClockSpeed = futureRealTimeClockSpeed.get(); 
      futureRealTimeClockSpeed = std::async(std::launch::async, getRealTimeCPUClock); 
     } 
     step(); 
    } 
} 

답변

3

valid()은 (cppreference의 항목이 다른 제안하지만) 당신이하지 생각하지 않습니다. 여기

이 표준의 말씀 약 valid() :

유효() const를 noexcept 부울 (30.6.6/18 §);

* this가 * 공유 상태를 나타내는 경우에만 true입니다.

valid()에 의해 반환되는 값은 한만큼 future 개체가 당신이 std::async를 사용하고 결과를 검색하기 전에 (get()를 사용하여 출시 후 일반적으로의 경우 유효한 공유 상태와 관련 될 때 true 될 것입니다). futureshare() 메서드를 사용하여 shared_future을 만들 때 무효화됩니다. 이 중 아무 것도 당신이하려는 일, 즉 결과가 사용 가능한지 확인하는 것과 관련이 없습니다.

나는 공의 지연으로 wait_for() 기능을 사용하는 것이 좋습니다하는 future의 결과가 준비가되어 있는지 여부를 확인하려면 :

if (futureRealTimeClockSpeed.wait_for(std::chrono::seconds(0)) 
      == std::future_status::ready) 
    /*...*/ 
+0

당신의 설명은 모두 정확하지만, 그들은/오해의 소지가 조금 부정확하다. 'valid '의 설명에 의해 참조되는 공유 상태는이'std :: future'가'std :: promise'와 상태를 공유한다는 것을 의미합니다. 미래의 상태를'std :: shared_future'로 옮기는 행위가 미래의 공유 상태를 없애고 결과적으로 무효화하는 'share' 메쏘드와 직접적으로 관련이 없습니다. 그러나 실제로'get '을 호출하면 미래가 무효화됩니다. 그래서'valid'는 미래가 약속에 연결되어 있고 그 값이 아직 검색되지 않았는지를 실제로 확인합니다. –

+0

@ChristianRau 네, 맞습니다. 필자는 필자의 주요 포인트는 결과가 유효한지 여부를 확인하는 올바른 방법을 제시하는 것이 었음을 인정해야한다. 나는 이제 그것을 조금 덜 오도하는 대답을 편집했다; 그러나 더 나은 개선 (또는 다른 누군가에 의한 별도의 대답)을위한 여지는 아직 남아 있습니다. – jogojapan