rust学习十六.3、并发-线程之间共享数据

打印 上一主题 下一主题

主题 861|帖子 861|积分 2593

线程之间共享数据,即go中部分人所憎恶的方式!
然而,这个方式并非没有其长处,否则操作系统也不提供这种实现方式。
 
闲言少序,上正文!
一、概述

 * 1.当我们大谈基于信道通信时,应该指的是应用级别。如果是操作系统,应该还是会有多种措施的,否则rust的源头在哪里来着。 * 2.rust共享内存,主要借助于Arc指针实现。所谓Arc,是Atomically Reference Counted的缩写,即原子引用计数。 它和Rc的主要 *   区别在于,Arc允很多线程同时访问,而Rc不允许。 * 3.此外还必要借助于Mutex(mutual exclusion 互相排斥之意),即互斥锁,来包管同一时刻只有一个线程可以访问共享资源。 * 4.Mutex的主要方法有lock(),lock用于获取锁,如果成功返回一个MutexGuard智能指针。获取锁的时候,会壅闭线程 * 5.MutexGuard智能指针实现了Deref和Drop,因此可以被当作原始数据的引用,同时Drop确保了当MutexGuard离开作用域时,锁会被释放。 * 6.Mutex 是一个雷同RefCell的智能指针,都提供了内部可变性 * 7.Mutex 也有造成 死锁(deadlock)的风险:当某个操作必要锁住两个资源,而两个线程分别持有两个资源的其中一个锁时,它们会永远相互等待 * 8.对于简单的数值运算,标准库中 std::sync::atomic 模块 提供了比 Mutex 更简单的类型。针对基本类型,这些类型提供了安全、并发、原子的操作 *   例如 AtomicI32  Mutex的结构代码
  1. #[stable(feature = "rust1", since = "1.0.0")]
  2. #[cfg_attr(not(test), rustc_diagnostic_item = "Mutex")]
  3. pub struct Mutex<T: ?Sized> {
  4.     inner: sys::Mutex,
  5.     poison: poison::Flag,
  6.     data: UnsafeCell<T>,
  7. }
复制代码
 
这个sys::Mutex是一个原子:
  1. pub struct Mutex {
  2.     futex: Atomic,
  3. }
复制代码
 用于持有锁position(位置标记/占据标记)是一个原子布尔,用于表现是否被占据data就是原始的数据了。 Mutex最常用的方法lock用于获得锁,并返回如下:[code] #[stable(feature = "rust1", since = "1.0.0")]    pub fn lock(&self) -> LockResult
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表