我正在编写一个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();
}
}
答案 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()