美文网首页
rust中线程之间共享内存的方法Arc>

rust中线程之间共享内存的方法Arc>

作者: 梁帆 | 来源:发表于2021-11-15 10:52 被阅读0次
use core::time;
use std::sync::Arc;
use tokio::sync::Mutex;

#[tokio::main]
async fn main() {
    let buf_str = Arc::new(Mutex::new(Vec::<String>::new()));
    let buf_num = Arc::new(Mutex::new(Vec::<u8>::new()));

    // 一定要先clone,使其引用计数+1
    let buf1 = buf_str.clone();
    let buf2 = buf_num.clone();

    // 线程1
    let thread1 = tokio::spawn(async move {
        for i in 0..10 {
            tokio::time::sleep(time::Duration::from_secs(1)).await;
            buf_str.lock().await.push(String::from("round:"));
            buf_num.lock().await.push(i);
        }
    });

    // 线程2
    let thread2 = tokio::spawn(async move {
        for i in 0..10 {
            tokio::time::sleep(time::Duration::from_secs(1)).await;
            println!("buf_str={:?}", buf1);
            if i == 5 {
                buf1.lock().await.clear();
            }
            println!("buf_num={:?}", buf2);
        }
    });

    thread1.await.unwrap();
    thread2.await.unwrap();
}

代码中,我们创建了两个线程thread1和thread2,这两个线程共享了两个内存空间,分别是buf_str,buf_num。
对于这些用于多线程共享的变量,我们要用Arc<Mutex<T>>来创建。Arc<T>是用于共享所有权,而Mutex<T>是一个支持跨线程安全共享可变变量的容器
Arc的全名就是:Atomically Reference Counted,即原子引用计数。因此想要在线程中共享避免value moved的错误,必须先将原子引用计数+1,即进行clone。

最后程序输出如下所示:

buf_str=Mutex { data: [] }
buf_num=Mutex { data: [0] }
buf_str=Mutex { data: ["round:"] }
buf_num=Mutex { data: [0] }
buf_str=Mutex { data: ["round:", "round:", "round:"] }
buf_num=Mutex { data: [0, 1, 2] }
buf_str=Mutex { data: ["round:", "round:", "round:"] }
buf_num=Mutex { data: [0, 1, 2, 3] }
buf_str=Mutex { data: ["round:", "round:", "round:", "round:"] }
buf_num=Mutex { data: [0, 1, 2, 3, 4] }
buf_str=Mutex { data: ["round:", "round:", "round:", "round:", "round:"] }
buf_num=Mutex { data: [0, 1, 2, 3, 4, 5] }
buf_str=Mutex { data: [] }
buf_num=Mutex { data: [0, 1, 2, 3, 4, 5, 6] }
buf_str=Mutex { data: ["round:"] }
buf_num=Mutex { data: [0, 1, 2, 3, 4, 5, 6, 7] }
buf_str=Mutex { data: ["round:", "round:"] }
buf_num=Mutex { data: [0, 1, 2, 3, 4, 5, 6, 7, 8] }
buf_str=Mutex { data: ["round:", "round:", "round:"] }
buf_num=Mutex { data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] }

可以看到线程的并发运行,以及线程2对buf1的清空结果。

相关文章

  • rust中线程之间共享内存的方法Arc>

    代码中,我们创建了两个线程thread1和thread2,这两个线程共享了两个内存空间,分别是buf_str,bu...

  • Rust 并发编程 - Memory Ordering

    在并发编程领域,Rust 提供了完善的机制来保证并发编程的安全,我们可以非常方便的使用 Mutex,Arc,Cha...

  • 共享内存

    共享内存操作 创建共享内存: int shmget(key_t key, size_t size, int shm...

  • Mutex

    Mutex header category pthread_mutex_t pthread_mutex_lock ...

  • IOS内存管理

    内存概述 内存是用来存啥的? 内存布局 哈希表 垃圾回收(GC) IOS内存管理机制 MRC & ARC T...

  • 《Objective-C高级编程 iOS与OS X多线程与内存管

    内存管理篇: 5.ARC的规则补充 ARC的方法命名 我们都知道,在内存管理的思考方式中,当方法命名以“alloc...

  • synchronized 不是自旋锁(gold_axe)

    操作系统os级别, 实现同步的方法 1.互斥量mutex:具体是这个对象: pthread_mutex_t(互斥锁...

  • Rust中Arc<T>类型

    如何线程间的安全使用同一对象,Arc 提供了一个不错的方案。 Arc共享T的所有权,同一堆空间。调用c...

  • Java内存模型精讲

    1.JAVA 的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存...

  • Linux slab 分配器

    动态内存管理 内存管理的目标是提供一种方法,为实现各种目的而在各个用户之间实现内存共享。内存管理方法应该实现以下两...

网友评论

      本文标题:rust中线程之间共享内存的方法Arc>

      本文链接:https://www.haomeiwen.com/subject/nadozltx.html