会议记录
chapter 1 problems
之前有标准库,它需要一些同步原语,最重要的就是互斥量,通常是对于某些东西的互斥访问,例如数据或某些其他资源,以便在威胁之间安全的共享它,所以互斥锁是一种在线程间共享某些东西的方法。
原语比互斥锁多,这些现在不重要,重要的是自己实现原语是困难的,锁实现中的错误通常非常微妙,很难找到,他们的错误是非常低级甚至有时特定于架构的代码之间的复杂交互。
在linux Mac 和其他unix上实现了pthread的一部分——pthread_mutex_t,在windos上有srw锁
所以鉴于他们的实现,我们是否可以将它包装起来并完成它,不幸的是,答案是否定的,因为这个是为c设计的,不符合rust的要求 ,用rust实现时,您会做到很多不同的非常微妙的事情,但这里只强调三个比较大的问题:
(1)如果你在rust中有一个对象,你可以将它移动到内存中的不同位置,这意味着对象在整个生命周期内不能保持在相同的内存地址,但是轻型读写锁的文档中说明锁不允许移动或拷贝,今天的大多数实际实现移动或复制读写锁是可以正常执行的,但是他们的规范或文档根本不允许他这么做,未来的实现可能会以不同的方式工作,因此我们必须遵从这些事实。
因此当作者解决时,将锁分配在堆上,包含在box中——struct Mutex(Box),实际的底层系统检测并没有发生移动。这个是可以工作的,但是非常的低效,因为这涉及到分配和交互,这意味着我们不能在编译时构造这些对象,所以你不能只拥有一个静态互斥对象,因为需要在运行时分配。(这就是产生低效的原因,因为运行时分配效率低)
(2)rust 对错误的使用必须是安全的,在rust中安全和非安全是有着严格的边界,但在内存安全方面仍然是完全安全的,一个总是恐慌或永远循环的程序,可能只是简单的错误,但他是完全安全的。这里举了一个rust重复上锁的例子,虽然程序是错误的,但是他却是安全的。死锁是安全的!
(3)rust 遗忘事情一定是安全的,这里举了一个锁定了一个互斥区,但是最后忘解锁了,并删除了他,在rust中这也是安全的。
结论:rust不是c,并且在现有事物之上改造rust的所有权和安全概念,rust是与众不同的,试图将c形状的钉子,放入rust形孔并不总是有效的。
chapter 2 a solution
用parking lot来代替锁,他是一个全局数据结构,由操作系统底层原语实现,parking lot已经有实现的crate,
对于mutexs就只是一个字节,而不用堆进行分配了,可以在编译时构造,因此可以成为静态变量,并且死锁和遗忘都是有很好的定义 。
突然在2019年11月讨论停了,是什么阻碍了他们,是因为有大量的新代码,和大量的学术知识
chapter 3 stuck
死锁在很多情况都会发生,现在会有人提出一些问题,但是会有人说parking lot可以解决,人们目前对parking lot抱有很大希望,但是当有人问parking lot怎么样了的时候,矛头会指向一个大规模的讨论
失败的尝试会变成阻碍
如果有人想解决parking lot的问题,就要阅读前几年的讨论
chapter4 tiny steps
障碍1 稳定性保证
标准库有一些承诺,我们在实现时要遵守这些承诺,
障碍2 可移动的mutexes
mutex是不可以移动的,所以我们将他放在box里,但是parking lot的实现,就不用放在box里,这很好
作者对每个平台做了各自的小改进,它实现了一个在windos中可以移动的互斥锁。
障碍3 新的操作系统原语
针对parking lot作者实现了新的os同步原语
linux上的park/unpark
windos上的waitonaddress
结论:小块更容易解决