C 断言调用方持有互斥锁

C 断言调用方持有互斥锁,c,pthreads,posix,mutex,assert,C,Pthreads,Posix,Mutex,Assert,今天有人问我,为什么没有函数pthread\u mutex\u assert\u locked可以用来(至少在错误检查互斥体时)断言调用方持有特定的互斥体。随后的讨论提出了实现断言的可能性,如下所示: assert(pthread_mutex_lock(m)==EDEADLK); 用于检查互斥锁时出错。如果互斥锁在到达互斥锁时被解锁,或者如果另一个线程将其锁定并解锁,这将可靠地触发断言失败,但在实际的死锁场景中,持有互斥锁的(其他)线程在进行断言的线程之前不会向前推进,它将死锁 这是我们对现有

今天有人问我,为什么没有函数
pthread\u mutex\u assert\u locked
可以用来(至少在错误检查互斥体时)断言调用方持有特定的互斥体。随后的讨论提出了实现断言的可能性,如下所示:

assert(pthread_mutex_lock(m)==EDEADLK);
用于检查互斥锁时出错。如果互斥锁在到达互斥锁时被解锁,或者如果另一个线程将其锁定并解锁,这将可靠地触发断言失败,但在实际的死锁场景中,持有互斥锁的(其他)线程在进行断言的线程之前不会向前推进,它将死锁


这是我们对现有pthread mutexapi所能做的最好的了吗?有没有更好的方法来声明互斥锁的所有权,从而可靠地触发不受死锁约束的事件?

您知道或者可以控制使用的互斥锁的类型,或者必须使用给定的互斥锁?在您不知道类型的情况下使用通用互斥将非常棘手。请参阅(和)以了解更多信息。我认为,假设这最多只能用于错误检查,也可能(不太可能)用于递归互斥。普通类型互斥体是专门设计的,以便它们能够优化了解其所有者的需求。我认为假设代码知道它使用的是哪种类型的互斥也是公平的<代码>断言(pthread\u mutex\u trylock(m)=EDEADLK)?不,我认为它需要pthreads库提供类似于
pthread\u mutex\u owned()
的东西。也就是说,如果我需要这个工具,我会使用我自己的互斥结构,其中包含
pthread\u mutex\u t
pthread\u t
,以及必要的处理函数,这样我就可以自己实现所有者检查。@NominalAnimal:这是一个很好的观点,你可以通过某种包装来实现它,但我想的方法是微创的,不需要改变函数签名。