相当于 tokio 任务的 Condvar

Equivalent of Condvar for tokio tasks

提问人:ixolius 提问时间:11/10/2023 更新时间:11/10/2023 访问量:60

问:

我正在使用依赖于运行时的框架,并且无法使用运行时的变体。 我还使用外语界面,这给了我一些关于线程的限制:我有一个资源,每个线程只能存在一次,否则我冒着未定义行为的风险。tokiocurrent_thread

目前,我正在解决这样的问题:

async fn use_the_resource(parameter: String,....) {
    while resource_exists_on_thread() {
        tokio::task::yield_now().await;
    }
    resource = create_resource(); //this will lead to undefined behavior, if a resource exists on the same thread
    use_resource(resource, parameter,...);
}

但这似乎不是最佳解决方案。我想要一种类似于 的机制,但用于任务而不是线程。这将允许我让任务等到我的资源可用。我不能真正使用 ,因为我不控制线程的创建。std::sync::CondvarMutex

锈-tokio

评论

2赞 Liel Fridman 11/10/2023
是否可以为整个程序提供一个资源实例?如果是这样,也许您可以生成一个任务,其唯一目的是处理此资源,并通过 mpsc 通道与它通信?
3赞 cdhowie 11/10/2023
“但是对于任务而不是线程”——但是,如果每个任务都不能解决问题,是吗?因为任务可以在线程之间移动,并且多个任务可以在同一线程上运行。
0赞 ixolius 11/10/2023
@cdhowie 如果任务移动到资源不在身边的另一个线程,它可能会恢复。我想看到的行为类似于 它只停止任务而不是阻塞线程。但这可能根本不可能(任务移动后通知将如何工作?wait_untilCondvar
2赞 cdhowie 11/10/2023
@ixolius 是的,让任务在等待中移动是一个问题。Tokio 的工作窃取模型似乎不太适合您的用例。您可以改为考虑使用“线程锁定”资源的任务部分。tokio::spawn_blocking

答:

0赞 Yoric 11/10/2023 #1

我相信你要找的是 https://docs.rs/tokio/latest/tokio/sync/struct.Notify.html

会片段大致翻译为:

async fn use_the_resource(parameter: String, ...) {
    resource_used_by_thread.await;
    resource = create_resource(...);
    use_resource(&resource, parameter, ...);
}

评论

1赞 Chayim Friedman 11/10/2023
除了。。。可以将任务移动到不同的线程之后,然后您将拥有 UB。Notify