thrd_busy和mtx_lock()/ mtx_timedlock()
我有关于C1x互斥量的以下问题(§7.25.4):
在哪种情况下mtx_lock()
返回thrd_busy
而不是阻塞? 在哪些情况下mtx_timedlock()
返回thrd_busy
?
请注意, thrd_busy
在§7.25.1¶5中定义为“ 当测试和返回函数请求的资源已被使用时 ”。
我希望thrd_busy
只能由mtx_trylock()
返回,或者当用mtx_try
或mtx_try | mtx_recursive
调用时,最多也只能由mtx_trylock()
返回mtx_try | mtx_recursive
mtx_try | mtx_recursive
互斥锁,但绝对不是来自mtx_timedlock()
,它需要一个支持超时的互斥锁,即mtx_timed
或mtx_timed | mtx_recursive
mtx_timed | mtx_recursive
互斥。
这只是草案中的公正和疏忽吗? 或者我错过了什么?
如果互斥锁不是递归的,但是您尝试以递归方式锁定它,则行为是未定义的。 但是,实现可以检测到这一点并返回thrd_busy
。 (或者,它可能永远阻止,或返回thrd_error
,或thrd_success
,或格式化您的硬盘……)
- mtx_lock()不返回thrd_busy,但是,如果请求的资源已被使用,则mtx_trylock函数返回thrd_busy。
- mtx_timedlock()不返回thrd_busy。 mtx_timedlock函数在成功时返回thrd_success,如果在未获取所请求资源的情况下达到指定时间则返回thrd_timedout,如果无法获得请求,则返回thrd_error。