在一個界面中的按鈕事件中需要向 所有在線的服務器 發送信息
void Dialog::Button_Click()
{
????map <unsigned long, CServer*>::iterator iter;
??? for ( iter = m_OnLineServers.begin(); iter != m_OnLineServers.end(); iter++ )
??? {
???????? iter->second->sendMsg();
??? }
}
所有 在線服務器 都存放在? m_OnLineServers? 這個列表中,這個列表是一個 std::map
sendMsg()?? 內部又調用了 SOCKET 函數的 send
當 send 執行失敗時,? 會通知 Dialog 的? OnServerClose() 事件
void Dialog::OnServerClose(int nIndex)
{
??map <unsigned long, CServer*>::iterator iter???= m_OffLineServers.find(nIndex);
??if ( iter != m_OffLineServers.end() )
??{
???m_OffLineServers.insert(make_pair<unsigned long, CServer*>(nIndex, iter_find->second));
???m_OnLineServers.erase(nIndex);
??}
OnServerClose() 事件需要把 CServer 從 Online 列表中刪除, 跟著添加到 OffLine 列表
結合起來看,就會出現在同一條線程中
遍歷 map
{
??? 刪除 map 元素
}
google了一下,網友們在遍歷的過程中刪除元素的方法是
for(iter = list.begin(); iter != list.end();)
{
??? if (shouldDelete(*iter))
?????? iter = list.erase(iter);
??? else
?????? ++iter;
}
似乎能解決問題,
但從上面的邏輯來看, 遍歷跟刪除, 分別是在兩個不同的類, 這樣一來邏輯就復雜多了
通常BUG都是因為復雜的邏輯而產生的。
Feedback
遍歷的過程很可能會調用一些刪除操作,而且調用得很隱含
這樣的情況是有的,而且不算什么異常的事情
這種情況下采用異步的刪除機制就可以了
這樣的情況是有的,而且不算什么異常的事情
這種情況下采用異步的刪除機制就可以了
只要是同一份內存數據,在同一個線程中,就不會出現所謂沖突的問題,仔細檢查下代碼,看看,你后面說的遍歷刪除map的問題是防止刪除最后一個元素的時候越界
| 只有注冊用戶登錄后才能發表評論。 | ||
|
||
|
相關文章:
|
||
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|
|


