#生命周期 #线程 #无锁 #后台线程

lifetime-thread

具有生命周期的线程。将值分为主从两部分。当主值的生命周期结束时,从值将无法访问。

3 个不稳定版本

0.3.0 2021年1月10日
0.2.3 2020年8月23日
0.1.1 2020年8月15日

#11#后台线程

每月 27 次下载
用于 buffer-trigger

MIT/Apache 许可协议

10KB
144

生命周期线程

具有生命周期的无锁线程。将值分为主从两部分。当主值的生命周期结束时,从值将无法访问。


简介

具有生命周期的无锁线程。将值分为主从两部分。当主值的生命周期结束时,从值将无法访问。

适用场景

  • 需要在后台执行操作,但生命周期不是静态的
  • ...

基本用法

use std::{thread, time::Duration};

#[test]
fn it_works() {
    let s = "xxx";
    let outer = lifetime_thread::spawn(s, |inner| {
        println!("begin");
        while let Some(t) = inner.get() {
            println!("ok! {}", t);
            assert_eq!(*t, "xxx");
            thread::sleep(Duration::from_millis(1));
        }
        println!("over")
    });
    thread::sleep(Duration::from_millis(10));
    assert_eq!(*outer, "xxx")
}

#[tokio::test]
async fn async_works() {
    let s = "xxx";
    let outer = lifetime_thread::async_spawn(s, |inner| async move {
        println!("begin");
        while let Some(t) = inner.get() {
            println!("ok! {}", t);
            assert_eq!(*t, "xxx");
            tokio::time::sleep(Duration::from_millis(1)).await;
        }
        println!("over")
    });
    tokio::time::sleep(Duration::from_millis(10)).await;
    assert_eq!(*outer, "xxx");
    drop(outer);
}

输出

begin
ok! xxx
ok! xxx
...
...
ok! xxx
over

特性

  • 不同的运行时
    • 同步(多线程):lifetime_thread::spawn
    • tokio:lifetime_thread::async_spawn

许可协议

根据您的选择,许可协议为以下之一:

贡献

除非您明确声明,否则根据 Apache-2.0 许可协议定义,您有意提交以包含在工作中的任何贡献,均应按照上述方式双许可,而不附加任何额外的条款或条件。

依赖

~2.6–8.5MB
~62K SLoC