C++程式設計師基本上每段程序都要和stl打交道,其中std::unordered_map是最常用的數據結構之一。接下來就介紹一個我使用unordered_map的時候遇到的一個坑。
很多程式設計師都會說,unordered_map使用很簡單呀,有什麼可講的。那我問一個簡單的問題:如何判斷一個元素在不在unordered_map裡面?
如果是寫慣了PHP的同學,上來就會用[]直接訪問,訪問不到就判斷是不是NULL就好了。就像下面的程序:
執行結果為:
看起來沒有任何問題。
但是如果我們多線程的訪問會發生什麼呢?
這段程序執行會發生什麼呢?
我們發現會有讀不到的情況
為什麼會這樣呢?
我們看下unorder_map的源碼
這是典型的 hash 操作的寫法
先對 key 算出 hash code找到這個 hash code 對應的桶在這個桶裡面,遍歷去找這個 key 對應的節點把節點返回但是如果找不到節點,不是返回空,而是會創建一個新的空白節點,然後返回這個空白節點。
這裡本質上是一個insert操作,所以在多線程讀unordered_map的時候,需要注意如果有判斷元素是否存在的場景,避免使用[]。
應該怎麼辦呢?
很簡單,使用find操作就可以啦。大家可以自己嘗試下。