std :: async似乎没有用std :: launch :: async生成线程

时间:2012-10-10 03:09:31

标签: c++ multithreading stdasync

我正在编写一个DCPU-16仿真器,我正在通过启动一个在单独的线程中调用函数getRealTimeCPUClock()的线程来计算CPU的实时时钟速度。问题是,即使未返回值,未来对象的“有效”属性似乎也是如此。因此,在调用futureObj.get()时,它会等待getRealTimeCPUClock()返回。

使用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(); 
    }
}

1 个答案:

答案 0 :(得分:3)

valid()不符合您的想法(尽管cppreference中的条目另有说明)。

以下是标准对valid()所说的内容:

  

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

     

返回:仅当* this指向共享状态时返回true。

只要valid()对象与有效的共享状态相关联,true返回的值就是future,这通常是在您使用{ {1}}并在检索结果之前(使用std::async)。使用get()方法创建future时,share()也将失效。这些都与您尝试做的事情无关,即检查结果是否可用。

要确定shared_future的结果是否准备就绪,我建议使用延迟为0的future函数:

wait_for()