gpt4 book ai didi

c++ - std::async 似乎没有使用 std::launch::async 生成线程

转载 作者:行者123 更新时间:2023-11-30 02:59:33 32 4
gpt4 key购买 nike

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

Returns: true only if *this refers to a shared state.

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

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

if (futureRealTimeClockSpeed.wait_for(std::chrono::seconds(0))
== std::future_status::ready)
/*...*/

关于c++ - std::async 似乎没有使用 std::launch::async 生成线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12811426/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com