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

时间:2011-06-25 13:21:29

标签: c++ c linux performance pthreads

当我查看pthread_rwlock_unlock函数的手册页时,我注意到如果调用线程没有rwlock的所有权,func将返回EPERM。

由于rdlock允许多个线程获取锁,因此必须有一个数据结构,如链接或数组,以存储一个特定rwlock的ownerid。

问题出现了:

rwlock旨在实现读取操作比写入操作更频繁的效率,但如果有大量不同的线程获得读取锁定,每次调用pthread_rwlock_unlock()时,都需要时间来查找在天气中,调用线程是有效的所有者。这个场景的时间复杂度是多少..

非常感谢你们:)

2 个答案:

答案 0 :(得分:6)

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.cpthread_rwlock_rdlock.c中的作者所有权。

您可以使用一个小程序对此进行测试,以声明并初始化一个锁,然后将其解锁。

因此,时间复杂度似乎足够接近于此实现中的常量,但是通过对您可能已经想到或想要存在的某些功能进行纾困来获得。

答案 1 :(得分:5)

请注意,返回EPERM不需要实现。解锁别人锁定的结果是未定义的,正如标准所规定的那样。

如果锁只存储使用计数而不是拥有线程列表,则很容易实现O(1)。如果实现坚持检查锁所有权,它可以使线程记住它拥有的锁。这种锁的数量通常应该很小。即使不是,通常也会以LIFO顺序获取多个锁,因此常见情况由线程中的一堆拥有锁覆盖。