如果一个堆叠的协同程序锁定了一个互斥对象,然后就屈服了,该怎么办

What if a stackful coroutine locks a mutex and then yield?

本文关键字:一个 对象 然后 怎么办 屈服 程序 锁定 如果      更新时间:2023-10-16

如果一个堆叠的协程锁定了一个互斥体(让我们首先考虑一个非递归互斥体(,然后在重新进入执行时产生,那么运行它的线程t2可能与产生t1之前的线程不同。那么会发生什么呢?

如果互斥是递归互斥,那么t1t2谁拥有该互斥?

它将保持锁定状态。

如果ren-enter发生在另一个线程上,那么互斥对象只会被错误的线程所拥有,充其量会导致UB。

另一方面,无堆栈协程只是伪装的开关,因此如果您使用lock_guard和类似的启用RAII的容器,那么可能会有过多的锁定/解锁,以及当yield发生在锁定下时的竞争

如果您的应用程序由许多协程组成(实际上您将使用fiber(,则不应该使用mutex。相反,您可以使用类似于利用原子的自旋锁的东西(例如,如果互斥锁被锁定,互斥锁在内部使用自旋锁,而不是调用内核来挂起线程(。

如果一个协程试图锁定这种特殊类型的互斥锁,而互斥锁已经被锁定,则可以挂起该协程并恢复另一个(==执行其他任务(。如果互斥锁被解锁,您可以恢复挂起的协程,并尝试再次锁定互斥锁。

相关文章: