我在程序中成功使用了Concurrency::concurrent_unordered_map
(這是由Microsoft制定的實現)。這是需要的,因爲多個元素的插入/更新和非常罕見的刪除是以併發方式執行的。並行容器 - 在元素擦除時同步
我知道這個容器(與所有其他併發容器一樣)提供了一個不安全的erase()
方法 - 用於擦除節點。
您認爲最好的方法是使擦除過程也是線程安全的嗎?這種情況很少像我剛纔所說的那樣發生(僅僅是因爲用戶干預),而且我不太喜歡在每次對容器執行搜索時都必須輸入一個關鍵部分(或者對於其他任何操作,如迭代器遍歷和節點更新)。你怎麼看?我也在考慮基於事件的機制,但我不明白這在這裏如何適用。
鎖定用互斥的部分,從容器中清除,開鎖。 –
互斥體的唯一問題是,似乎必須在同一個互斥體中包含對容器所做的所有其他更新:所以對元素的所有插入,迭代器遍歷更新都必須由相同的互斥體保護。我寧願選擇另一種解決方案 – Ghita
好吧,你必須將擦除函數包裝到'sync_erase()'中,並且保證客戶*只調用該函數。然後你只把互斥鎖放在那裏。 –