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();
}
}
당신의 설명은 모두 정확하지만, 그들은/오해의 소지가 조금 부정확하다. 'valid '의 설명에 의해 참조되는 공유 상태는이'std :: future'가'std :: promise'와 상태를 공유한다는 것을 의미합니다. 미래의 상태를'std :: shared_future'로 옮기는 행위가 미래의 공유 상태를 없애고 결과적으로 무효화하는 'share' 메쏘드와 직접적으로 관련이 없습니다. 그러나 실제로'get '을 호출하면 미래가 무효화됩니다. 그래서'valid'는 미래가 약속에 연결되어 있고 그 값이 아직 검색되지 않았는지를 실제로 확인합니다. –
@ChristianRau 네, 맞습니다. 필자는 필자의 주요 포인트는 결과가 유효한지 여부를 확인하는 올바른 방법을 제시하는 것이 었음을 인정해야한다. 나는 이제 그것을 조금 덜 오도하는 대답을 편집했다; 그러나 더 나은 개선 (또는 다른 누군가에 의한 별도의 대답)을위한 여지는 아직 남아 있습니다. – jogojapan