2011-01-09 117 views
3

我正在使用boost-asio在C++中使用多線程服務器。目前我遇到了一個設計問題,就是處理擦除連接的問題。C++多線程服務器幫助

我有一個服務器實例,它包含連接對象的向量。這些連接接收我解析的命令。一個命令特別處理向我的向量中的所有連接發送數據。

現在,當連接斷開連接時,我正在從矢量中刪除此連接並調用析構函數。看起來好像我會在某人'斷開連接'的同時發生'SendAll'時遇到問題。

任何人都可以推薦一個更好的設計或只是指向正確的方向嗎?任何幫助不勝感激。謝謝

回答

5

無論什麼類維護這個連接矢量需要一個strand。訪問,添加或從矢量中刪除時,使用strand::poststrand::dispatch。文檔中詳細解釋了strand concept

甲鏈被定義爲事件的嚴格順序 調用 處理程序(即,沒有併發 調用)。線的使用允許 程序在多線程 程序中的執行,而不需要明確的 鎖定(例如使用互斥體)。

1

圍繞矢量鎖定不是一個選項嗎?對矢量的每個訪問都首先獲得一個鎖;這將阻止你的競爭條件。只要服務器連接不經常發生,它就不會成爲瓶頸。

+0

如果可能的話,您應該更喜歡使用asio鏈而不是mutex。 – 2011-01-09 16:00:17

+0

感謝您的建議!我選擇了Sam的帖子,因爲它使用asio的鏈,但我發現你的帖子也非常有幫助。 – flumpb 2011-01-11 01:41:46