CountStrings: Using concurrent_hash_map
The container concurrent_hash_map (Chapter 5) is similar to the associative containers of STL, but it permits concurrent accesses to its elements. The hash table provides a way to use associative arrays that allows you to store data indexed by keys of any type you desire. For this example, we will start with a program that uses a standard STL map (hash map) to count the occurrences of distinct strings in an array and uses the parallel_for template to run in parallel. Because the STL map is not thread-safe (STL containers are not thread-safe in general), synchronization is required to avoid corruption of the map when more than one thread tries to access it concurrently.
Example 11-27 shows our initial hybrid implementation. Step by step, we’ll examine how to replace the uses of the STL map with a Threading Building Blocks concurrent_hash_map. Because concurrent_hash_map is thread-safe, this will allow us to remove the coarse-grained synchronization using a native lock, which STL required.
Example 11-27. CountStrings using STL map with a coarse-grained lock
1 #include "my_native_lock_wrappers.h" 2 #include <map> 3 #include "tbb/blocked_range.h" 4 #include "tbb/parallel_for.h" 5 #include "tbb/tick_count.h" 6 #include "tbb/task_scheduler_init.h" 7 #include <string> 8 #include <cctype> 9 10 using namespace tbb; 11 using namespace std; 12 13 LOCK_TYPE my_lock; 14 15 //! maps strings to ints. 16 typedef map<string,int> StringTable; 17 18 //! Function ...