簡體   English   中英

在C中同時修改鏈表

[英]Concurrent modification of linked list in C

我已經編寫了一個C應用程序來對DNS服務器(在VM上運行)進行壓力測試,我試圖獲得最大的DNS請求速率(吞吐量)以查看其行為。
我的應用程序運行兩個線程,一個發送線程生成DNS請求(具有不同的查詢名稱),然后將它們通過套接字發送到服務器;另一個接收線程,它在同一套接字上接收DNS響應並計算響應時間。

現在,這里使用並發鏈接列表(我已經實現),發送線程為每個發送的請求附加查詢名稱和發送時間(到列表末尾)。 接收線程每次都從頭開始運行,查找具有相關發送時間的查詢名稱,計算響應時間並從列表中刪除對象,它遍歷的每個對象還會檢查發送時間是否在DNS超時窗口內設置,如果不是,則將該請求視為未答復,然后將其從列表中刪除。

現在的問題是,每次在接收線程中也要刪除節點時,列表的整個遍歷都必須鎖定,這嚴重影響了發送線程,該線程停止發送,在鎖上等待了很多時間才能追加。

您是否建議以其他方式實施鎖定? 也許還有其他我可以改變的重大事情?

PS:我試圖在腳本中使用unix dig並在python scapy中實現相同的功能,但無法達到我在C應用程序中達到的速率(不鎖定發送最高可達10 Mbit),這就是為什么我選擇了用C實現

謝謝!

你也許並不需要,而接收線程掃描它來鎖定整個列表。 發送線程只會修改當前的最后一個節點(以追加一個新節點),並且只要保持指向當前尾部的指針,就不需要檢查任何其他節點。 就其本身而言,接收線程然后可以刪除除當前尾部以外的任何節點,而不會對發送線程造成任何影響。 因此,僅尾節點需要被鎖定。

在當前尾巴上保持移動鎖定可能有點棘手,因為您需要知道是哪個節點,但是我認為這不會太難。 例如,您可以提供一個指向尾部的共享原子指針,發送方在發送每個請求之前都會更新尾部,接收方在收到響應后會進行讀取。 接收者不需要考慮任何后續請求(因為在收到當前響應時尚未發送這些請求)。

接收者有時可能需要等待發送者追加至少一個請求,以便可以刪除以前的尾巴,但是我希望這種情況很少見。 否則,我看不到您的列表現在怎么會這么長,以至於在掃描過程中將整個過程鎖定都太耗時。

暫無
暫無

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

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