当前位置:嗨网首页>书籍在线阅读

16-什么是线程安全

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.5.1 什么是线程安全

线程安全是一种类型或者一段代码的属性,当由多个线程执行或访问时,不会导致意外行为。它指的是这样一种思想,即数据对于读取是一致的,多个线程同时写入时,数据不会被损坏。

Rust仅保护用户不会受到数据竞争问题的困扰。它的目标不是防止死锁,因为死锁很难被发现。它将借助第三方软件包来解决这个问题,例如parking_lot程序库。

Rust有一种新颖的方法来防止数据竞争。大多数线程安全位都已经嵌入spawn函数的类型签名中。让我们来看看它的类型签名:

fn spawn<F, T>(f: F) -> JoinHandle<T>
    where F: FnOnce() -> T,
        F: Send + 'static,
        T: Send + 'static

这是一个看上去非常烦琐的类型签名。让我们对其中的内容进行逐一分析。

  • spawn是一个包含F和T的泛型函数,并且会接收一个参数f,返回的泛型是JoinHandle。随后的where子句指定了多个特征边界。
  • F:FnOnce() -> T:这表示F实现了一个只能被调用一次的闭包。换句话说,f是一个闭包,通过值获取所有内容并移动从环境中引用的项。
  • F:Send + 'static:这表示闭包必须是发送型(Send),并且必须具有'static的生命周期,同时执行环境中闭包内引用的任何类型必须是发送型,必须在程序的整个生命周期内存活。
  • T:Send + 'static:来自闭包的返回类型T必须实现Send+'static特征。

Send是一种标记性特征。它只用于类型级标记,意味着可以安全地跨线程发送值;并且大多数类型都是发送型。未实现Send特征的类型是指针、引用等。此外,Send是自动型特征或自动派生的特征。复合型数据类型,例如结构体,如果其中的所有字段都是Send型,那么该结构体实现了Send特征。