到目前為止,我每秒都在呼叫以下函式:
function TForm1.ListeConnecteMaj():Boolean;
var
i : integer;
List : TIdContextList;
Client : TSimpleClient;
begin
List := TCPServer1.Contexts.LockList;
try
NbSConnect := List.Count;
for i := 0 to List.Count -1 do
begin
Client := List[i];
..... // getting information from Client
end;
finally
TCPServeur1.Contexts.UnlockList;
end;
end;
由于我需要支持數百個同時連接,我想盡可能減少 LockList 的持續時間。我試過這個。它有效,但它真的安全嗎?
function TForm1.ListeConnecteMaj():Boolean;
var
i : integer;
List : TIdContextList;
Client : TSimpleClient;
begin
List := TCPServer.Contexts.LockList;
TCPServeur.Contexts.UnlockList;
try
NbSConnect := List.Count;
for i := 0 to List.Count -1 do
begin
Client := List[i];
..... // getting information from Client
end;
finally
end;
end;
uj5u.com熱心網友回復:
它有效,但它真的安全嗎?
不,它不是執行緒安全的。
您可以安全地使用List獲取的參考,LockList直到您呼叫UnlockList. 您呼叫的那一刻UnlockList,串列將不再受到保護,List此后的任何訪問都可能導致并發問題。
您的原始代碼是正確使用LockList/UnlockList.
uj5u.com熱心網友回復:
正如@DalijaPrasnikar 的回答所解釋的那樣,您的提議不安全,不。一旦串列解鎖,服務器就可以在客戶端連接和斷開連接時自由修改串列的內容,這將導致您的代碼出現并發問題。
我會建議一種不同的方法 - 不是每秒輪詢客戶端串列,而是在客戶端串列更改時根據需要使用OnConnect和OnDisconnect事件從您的 UI 添加/洗掉元素。如果您嘗試在套接字操作期間跟蹤每個客戶端的狀態更新,您可以在通知發生時將通知發布到主 UI 執行緒。
uj5u.com熱心網友回復:
感謝您的回答。遵循此 CheckQueue 示例是否可以執行以下操作:
替換“串列:= TCPServer.Contexts.LockList;” 用“ List.Assign(TCPServer.Contexts.LockList);”
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/433784.html
上一篇:如何提取域名后綴?
