Я пишу эмулятор DCPU-16 и вычисляю тактовую частоту процессора в реальном времени, запуская поток, который вызывает функцию getRealTimeCPUClock () в отдельном потоке. Проблема в том, что атрибут «valid» будущего объекта имеет значение true, даже если он не вернул значение. В результате при вызове futureObj.get () он ожидает возврата getRealTimeCPUClock ().
С политикой запуска асинхронного (в отличие от отложенного) разве не предполагается запускать функцию в фоновом режиме, а затем, когда она возвращает, установить для действительного атрибута значение 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()
не то, что вы думаете, что делает (хотя запись в cppreference предполагает иначе).
Вот что говорит Стандарт valid()
:
(§ 30.6.6 / 18)
bool valid () const noexcept;Возвращает: true, только если * это относится к общему состоянию.
Значение, возвращаемое valid()
будет true
до тех пор, пока future
Объект связан с допустимым общим состоянием, что обычно происходит после того, как вы запустили его с помощью std::async
и прежде чем вы получите результат (используя get()
). future
также будет недействительным при использовании share()
метод для создания shared_future
, Ничто из этого не связано с тем, что вы пытаетесь сделать, то есть проверить, доступен ли результат.
Чтобы определить, является ли результат future
готов, я предлагаю использовать wait_for()
функция с задержкой 0:
if (futureRealTimeClockSpeed.wait_for(std::chrono::seconds(0))
== std::future_status::ready)
/*...*/
Других решений пока нет …