我正在使用C,pthreads和套接字在Linux中編寫應用程序。多線程訪問數據結構
這將是客戶端 - 服務器應用程序,服務器將具有N + 2個線程,其中N - 活動客戶端的數目,一個線程用於接受新連接併爲客戶創造和最後一個線程將被接受用戶輸入。
我將使用鏈表來保存一些數據,這將是有關我的應用程序,與每一位客戶都會有我的列表中相關聯的一個節點。那些客戶端線程會以一定的時間間隔更新存儲在其節點中的信息,可能是一秒鐘,可能是兩分鐘,它會動態更改。
現在問題在於,如果用戶請求它,存儲在鏈接列表中的信息需要寫入標準輸出。當然,在寫作時我應該獲得互斥體。我擔心整個列表中的一個互斥量會妨礙性能。
我在考慮將互斥鎖與每個節點關聯起來,但它會使一些指定節點的移除複雜化(首先,我需要確保'stdout writer'線程不會遍歷列表,我也會需要獲取我的節點的互斥體和前一個節點來改變指向下一個節點的指針,依此類推 - 或者我需要遍歷所有前一個節點,或者我需要創建雙鏈表)。
所以我想知道如果涉及多個互斥體的解決方案,甚至更好用更復雜的代碼,條件和這一切的鎖定,等待和解鎖。
那麼這又怎麼樣呢,而不是物理地去除節點,我將它們標記爲「未使用」,這樣在寫入數據和刪除期間就不會有任何問題,因爲我不需要訪問任何其他節點,如果讀者想要遍歷他將鎖定它的列表,並且只有當列表沒有被讀者遍歷時纔會發生列表添加。 – Andna
你可以做到這一點 - 但考慮是否值得。添加新節點將搜索未使用節點,然後分配一個,如果沒有未使用的節點。遍歷列表必須足夠聰明以跳過未使用的列表。刪除會更容易一些,因爲您不必調整鏈接,但仍然需要使用鎖來標記未使用的節點,所以不妨將其從列表中拉出。到處都是,我認爲將節點標記爲未使用會使代碼變得更加複雜,而沒有太多收穫。 – twalberg
好吧,我想我會使用讀寫鎖,據我所知,我可以保證作者將有權限讀者訪問列表。 – Andna