当读者很多时使用pthread_rwlock的效率

|| 在查看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中的作者所有权。 您可以使用一个小程序来测试它,以声明和初始化锁,然后将其解锁。 因此,在此实现中,时间复杂度似乎已经足够接近恒定,但是它是通过依赖于您可能已经想到或希望拥有的某些功能而获得的。     
        请注意,不需要实现即可返回EPERM。根据标准的规定,解锁他人锁的结果是不确定的。 如果锁仅存储使用计数而不是拥有线程的列表,则很容易实现O(1)。如果实现坚持要检查锁的所有权,则它可以使线程记住其拥有的锁。这种锁的数量通常应该很小。即使不是,通常也会按照LIFO顺序获取多个锁,因此常见的情况是由线程中一堆拥有的锁覆盖的。     

要回复问题请先登录注册