补充一下,现代的 Mutex 其实内部都会自旋一段时间,获取不到锁并不会直接进行系统调用而休眠,因为现在处理器速度非常快,很多时候自旋的时候锁就被释放了。
tokio 的 Mutex 使用原则基本上是:假如是多 task 操作一个 Vec 那种,临界区非常小,并且不跨越 await (因为 await 点可能出现一个线程加锁,另一个线程释放的问题,所以 std Mutex guard 是!Send ,导致整个 future 都是!Send) ,直接用 std 的 Mutex 就好。但是假如是独占了一个需要长时间使用数据,例如异步的数据库链接,这种才需要使用 tokio Mutex 。 |