Home

Awesome

Concurrent trie-hash map

Build Status

Concurrent trie-hash map library -- a general purpose associative array, combining the elements of hashing and radix trie. Highlights:

The implementation is written in C11 and distributed under the 2-clause BSD license.

NOTE: Delete operations (the key/data destruction) must be synchronised with the readers using some reclamation mechanism. You can use the Epoch-based Reclamation (EBR) library provided HERE.

References (some, but not all, key ideas are based on these papers):

API

If the map is created using the THMAP_SETROOT flag, then the following functions are applicable:

The thmap_ops_t structure has the following members:

Notes

Internally, offsets from the base pointer are used to organise the access to the data structure. This allows user to store the data structure in the shared memory, using the allocation/free functions. The keys will also be copied using the custom functions; if THMAP_NOCOPY is set, then the keys must belong to the same shared memory object.

The implementation was extensively tested on a 24-core x86 machine, see the stress test for the details on the technique.

Caveats

Performance

The library has been benchmarked using different key profiles (8 to 256 bytes), set sizes (hundreds, thousands, millions) and ratio between readers and writers (from 60:40 to 90:10). In all cases it demonstrated nearly linear scalability (up to the number of cores). Here is an example result when matched with the C++ libcuckoo library:

Disclaimer: benchmark results, however, depend on many aspects (workload, hardware characteristics, methodology, etc). Ultimately, readers are encouraged to perform their own benchmarks.

Example

Simple case backed by malloc(3), which could be used in multi-threaded environment:

thmap_t *kvmap;
struct obj *obj;

kvmap = thmap_create(0, NULL);
assert(kvmap != NULL);
...
obj = obj_create();
thmap_put(kvmap, "test", sizeof("test") - 1, obj);
...
obj = thmap_get(kvmap, "test", sizeof("test") - 1);
...
thmap_destroy(kvmap);

Packages

Just build the package, install it and link the library using the -lthmap flag.