std :: async не создает поток с помощью std :: launch :: async

Я пишу эмулятор 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();
}
}

1

Решение

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)
/*...*/
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]