如果一个堆叠的协同程序锁定了一个互斥对象,然后就屈服了,该怎么办
What if a stackful coroutine locks a mutex and then yield?
如果一个堆叠的协程锁定了一个互斥体(让我们首先考虑一个非递归互斥体(,然后在重新进入执行时产生,那么运行它的线程t2
可能与产生t1
之前的线程不同。那么会发生什么呢?
如果互斥是递归互斥,那么t1
和t2
谁拥有该互斥?
它将保持锁定状态。
如果ren-enter发生在另一个线程上,那么互斥对象只会被错误的线程所拥有,充其量会导致UB。
另一方面,无堆栈协程只是伪装的开关,因此如果您使用lock_guard和类似的启用RAII的容器,那么可能会有过多的锁定/解锁,以及当yield
发生在锁定下时的竞争
如果您的应用程序由许多协程组成(实际上您将使用fiber(,则不应该使用mutex。相反,您可以使用类似于利用原子的自旋锁的东西(例如,如果互斥锁被锁定,互斥锁在内部使用自旋锁,而不是调用内核来挂起线程(。
如果一个协程试图锁定这种特殊类型的互斥锁,而互斥锁已经被锁定,则可以挂起该协程并恢复另一个(==执行其他任务(。如果互斥锁被解锁,您可以恢复挂起的协程,并尝试再次锁定互斥锁。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 绘制一个对象,比较模具缓冲区的两个不同值