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 ...

Get Intel Threading Building Blocks now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.