当我查看pthread_rwlock_unlock函数的手册页时,我注意到如果调用线程没有rwlock的所有权,func将返回EPERM.
由于rdlock允许多个线程获取锁,因此必须有一个数据结构,如链接或数组,以存储一个特定rwlock的ownerid.
问题出在这里:
rwlock旨在实现读取操作比写入操作更频繁的效率,但如果有大量不同的线程获得读取锁定,每次调用pthread_rwlock_unlock()时,都需要时间来查找天气调用线程是有效的所有者.这个场景的时间复杂度是多少?
非常感谢你们:)
最佳答案
n.m提供了一个很好的答案.您对保留锁所有权的结构的假设在您标记的linux实现上是错误的,并且类似于计数方法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检查作者所有权.
您可以使用一个小程序来测试它,以声明并初始化一个锁,然后解锁它.
因此,时间复杂度似乎足够接近于此实现中的常量,但是通过对您可能已经想到或想要存在的某些功能进行纾困来获得.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。