gpt4 book ai didi

c++ - C++ 中的上下文选择功能

转载 作者:行者123 更新时间:2023-12-04 11:22:51 25 4
gpt4 key购买 nike

想象一种情况,我想调用一个执行一定量处理但有时间限制的函数。我可以使用 context.Context 在 golang 中编写一个函数和 select .我会想象如下:

package main

import (
"context"
"fmt"
"time"
)

func longRunning(ctx context.Context, msg string) {
stop := make(chan bool)
done := make(chan bool)

go func() {
for {
fmt.Printf("long running calculation %v...", msg)
select {
case <-stop:
fmt.Println("time to stop early!")
return
default:
}
}
done <- true
}()

select {
case <-done:
return
case <-ctx.Done():
stop <- true
return
}
}

func main() {
ctx := context.Background()
ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
defer cancel()

longRunning(ctx, "wheeee")
}
有没有一种模式可以用来在 C++ 中实现类似的结果?在上面的示例中 select能够以非阻塞方式收听 channel 。是否有某种类型的 eventfd 文件描述符并监听事件的方法?
我可以使用标准库或 boost 中的某些东西吗?或者,是否有任何我可以引用的在线开源示例。
任何建议或提示将不胜感激。

最佳答案

沿着这些路线的东西,也许:

void longRunning(std::atomic<bool>& stop) {
for (;;) {
if (stop) return;
// Do a bit of work
}
}

int main() {
std::atomic<bool> stop = false;
auto future = std::async(std::launch::async, longRunning, std::ref(stop));
future.wait_for(std::chrono::seconds(num_seconds));
stop = true;
future.get(); // wait for the task to finish or exit early.
}
Demo

关于c++ - C++ 中的上下文选择功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68051489/

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