在查看pthread_rwlock_unlock函数的手册页时,我注意到,如果调用线程不具有rwlock的所有权,则func将返回EPERM。
由于rdlock允许多个线程获取锁,因此必须有一个数据结构(如链接或数组)来存储一个特定rwlock的ownerid。
问题来了:
rwlock旨在在读操作比写操作频繁得多时实现效率,但是如果有很多不同的线程获得了读锁,则每次我调用pthread_rwlock_unlock()时,都要花点时间找出天气。调用线程是有效所有者。这种情况的时间复杂度是多少。
非常感谢大家:)
最佳答案
n.m提供了一个很好的答案。在标记的linux实现中,您对持有锁所有权的结构的假设是错误的,并且类似于count方法n.m。涉及。
这是来自/usr/include/bits/pthreadtypes.h的pthread_rwlock_t类型的编辑版本。
struct
{
int __lock;
unsigned int __nr_readers;
unsigned int __readers_wakeup;
unsigned int __writer_wakeup;
unsigned int __nr_readers_queued;
unsigned int __nr_writers_queued;
int __writer;
int __shared;
unsigned int __flags;
} __data;
您可以看到计数字段。同样,pthread_rwlock_unlock.c不返回EPERM,并且大部分工作都围绕检查pthread_rwlock_wrlock.c和pthread_rwlock_rdlock.c中的作者所有权。
您可以使用一个小程序来测试它,以声明和初始化锁,然后将其解锁。
因此,在此实现中,时间复杂度似乎已经足够接近恒定,但可以通过依赖于您可能已经想到或想要的某些功能来获得。