網絡負載平衡改造(續2)

  昨天有點事耽誤了... 今天又接着改造... , 在改造的時候遇到了一個之前就曾經發生的問題: 因爲epoll_wait和event處理使用2個不同的線程, 這就導致了, 有可能出現, 當event處理線程釋放該connection, 但是epoll_wait線程已經獲取了該event通知, 並壓入event處理線程, 當event處理線程再次處理該事件時, 會訪問非法空間一致崩潰 ...

 

  想了半天, 終於有了一個好想法, 因爲現在所有的事件都有一個event_type, 但其容量很小, 這樣就可以將event_type和fd(或vfd)壓縮在一個8字節空間內, 犧牲1個字節作爲event_type, 已經非常滿足需求, 而event處理線程在拿到event時, 會先根據類型取出fd(或vfd), 查看其有效性, 並繼續執行.

  這樣就可以解決這種很尷尬的併發問題 :)

 

  不過, 還需要額外注意一個問題, 系統中現在有兩種event, 一種是用戶讀事件, 一種是timer事件, 這裏我採用hash_tbl作爲線程之間的管道, 這是爲了防止epoll_wait返回的事件具有重複性, 所以保證管道里的事件具有唯一性, 需要採用K-V方式進行控制, 這樣KEY的選取就需要保持一致性, 現在考慮的策略就是採用統一的VFD生成管理器生成該KEY, 從而保證KEY的唯一有效不重複.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章