1

我正在编写一个 DCPU-16 仿真器,并且通过在单独的线程中启动一个调用函数 getRealTimeCPUClock() 的线程来计算 CPU 的实时时钟速度。问题是未来对象的“有效”属性似乎是真的,即使它没有返回值。因此,当调用 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(); 
    }
}
4

1 回答 1

3

valid()不是您认为的那样(尽管cppreference中的条目另有说明)。

这是标准所说的valid()

(§ 30.6.6/18) bool valid() const noexcept;

返回:仅当 *this 指的是共享状态时才为真。

只要对象与有效的共享状态相关联,返回的值valid()就会一直存在,通常是在使用启动它之后和检索结果之前(使用)。当您使用该方法创建. 这些都与您尝试做的事情无关,即检查结果是否可用。truefuturestd::asyncget()futureshare()shared_future

判断a的结果是否future准备好,我建议使用wait_for()延迟为0的函数:

if (futureRealTimeClockSpeed.wait_for(std::chrono::seconds(0))
          == std::future_status::ready)
   /*...*/
于 2012-10-10T08:16:41.420 回答