簡體   English   中英

當有很多讀者時使用pthread_rwlock的效率

[英]The efficiency of using a pthread_rwlock when there are a lot of readers

當我在查看pthread_rwlock_unlock函數的手冊頁時,我注意到如果調用線程沒有rwlock的所有權,func將返回EPERM。

由於rdlock允許多個線程獲取鎖,因此必須有一個數據結構,如鏈接或數組,以存儲一個特定rwlock的ownerid。

問題出在這里:

rwlock旨在實現讀取操作比寫入操作更頻繁的效率,但如果有大量不同的線程獲得讀取鎖定,每次調用pthread_rwlock_unlock()時,都需要時間來查找天氣調用線程是有效的所有者。 這個場景的時間復雜度是多少?

非常感謝你們:)

nm提供了一個很好的答案。 您對保留鎖所有權的結構的假設在您標記的linux實現上是錯誤的,並且類似於nm觸及的計數方法。

以下是/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中的編寫器所有權。

您可以使用一個小程序來測試它,以聲明並初始化一個鎖,然后解鎖它。

因此,時間復雜度似乎足夠接近於此實現中的常量,但是通過對您可能已經想到或想要存在的某些功能進行紓困來獲得。

請注意,返回EPERM不需要實現。 解鎖別人的鎖定的結果是未定義的,正如標准所規定的那樣。

如果鎖只存儲使用計數而不是擁有線程列表,則很容易實現O(1)。 如果實現堅持檢查鎖所有權,它可以使線程記住它擁有的鎖。 這種鎖的數量通常應該很小。 即使不是,通常也會以LIFO順序獲取多個鎖,因此常見情況由線程中的一堆擁有鎖覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM