本文以Rc
和RefCell
为例,讨论Rust中的Send
和Sync
是如何保证线程安全的。
基本概念
Send
和Sync
位于标准库std::marker
模块中。它们属于标记trait,也就是说,它们没有方法,也没有内置任何功能。它们的作用是:
如果类型
T
实现了Send
,则将类型T
的值传递给另一个线程不会导致数据争用(data rases)或其他不安全性如果类型
T
实现了Sync
,则将类型T
的引用&T
传递到另一个线程中不会导致数据争用或其他不安全性(T: Sync
暗含着&T: Send
)
也就是说,Sync
与类型跨多个线程共享时有关,而Send
则讨论类型被move到另一个线程的行为方式。
Allowing Transference of Ownership Between Threads with Send
Send
允许在线程间转移所有权
Allowing Access from Multiple Threads with Sync
Sync
允许多线程访问
在Rust的标准库<