/LockFreeRedBlackTree

Implementation of lock-free red-black tree using CAS

Primary LanguageC++

# here is our final project pf course 15618@CMU.
# we have implemented a lock-free version of red-black tree acoording to the following paper
# Kim J H, Cameron H, Graham P. Lock-free red-black trees using cas

## Summary
We found that there are many flaws within this paper and the pseudocodes are inconsistent. We believe 
that's why there are no experiments in the paper (i.e., the authors didn't manage to implement it) and
why it is hard to implement, especially the MoveUpRule.

However, we managed to implement this algorithm with both insert and remove (linear speedup with multi-threads)
in branch `spacingAndMoveUp`. What's more, we found that the two rules proposed by the paper is unnecessary
that we introduced a much simpler marker mechanism in our report, which will avoid the `double marker problem`
and thus do not need the two rules. The implementation of the simplified version is in branch master.

## Run test demo
To run tests for lock-free (both insert and remove):

    1. go to the root folder of this repository
    2. run `python3 src/gen_data.py`, this will generate a `data.txt` containing 100,000 numbers
    3. if there's no dir called `build`, then `mkdir build`
    4. run `make`
    5. run `./test_parallel`, it will automatically run tests on both insert and remove functions
       in the case of {1,2,4,8,16} threads and sleeps {0, 0.000001, 0.00001, 0.0001, 0.001} seconds
       between every two operations to provide different contention scenario.

Sample stdout:
---------------------------------------------------
bash-4.2$ ./test_parallel 
total_size: 100000
time taken by insert with 1 threads and sleep 0 seconds: 5.456105sec
time taken by remove with 1 threads and sleep 0 seconds: 5.492099sec
time taken by insert with 2 threads and sleep 0 seconds: 2.761535sec
time taken by remove with 2 threads and sleep 0 seconds: 2.758071sec
time taken by insert with 4 threads and sleep 0 seconds: 1.382796sec
time taken by remove with 4 threads and sleep 0 seconds: 1.389684sec
time taken by insert with 8 threads and sleep 0 seconds: 0.686128sec
time taken by remove with 8 threads and sleep 0 seconds: 0.696240sec
time taken by insert with 16 threads and sleep 0 seconds: 0.358965sec
time taken by remove with 16 threads and sleep 0 seconds: 0.372839sec

time taken by insert with 1 threads and sleep 1e-06 seconds: 5.519208sec
time taken by remove with 1 threads and sleep 1e-06 seconds: 5.554028sec
time taken by insert with 2 threads and sleep 1e-06 seconds: 2.812645sec
time taken by remove with 2 threads and sleep 1e-06 seconds: 2.819834sec
time taken by insert with 4 threads and sleep 1e-06 seconds: 1.414126sec
time taken by remove with 4 threads and sleep 1e-06 seconds: 1.417157sec
time taken by insert with 8 threads and sleep 1e-06 seconds: 0.711227sec
time taken by remove with 8 threads and sleep 1e-06 seconds: 0.708651sec
time taken by insert with 16 threads and sleep 1e-06 seconds: 0.372079sec
time taken by remove with 16 threads and sleep 1e-06 seconds: 0.388966sec

time taken by insert with 1 threads and sleep 1e-05 seconds: 6.415008sec
time taken by remove with 1 threads and sleep 1e-05 seconds: 6.459631sec
time taken by insert with 2 threads and sleep 1e-05 seconds: 3.269116sec
time taken by remove with 2 threads and sleep 1e-05 seconds: 3.256373sec
time taken by insert with 4 threads and sleep 1e-05 seconds: 1.633940sec
time taken by remove with 4 threads and sleep 1e-05 seconds: 1.639143sec
time taken by insert with 8 threads and sleep 1e-05 seconds: 0.810158sec
time taken by remove with 8 threads and sleep 1e-05 seconds: 0.818031sec
time taken by insert with 16 threads and sleep 1e-05 seconds: 0.477665sec
time taken by remove with 16 threads and sleep 1e-05 seconds: 0.435705sec

time taken by insert with 1 threads and sleep 0.0001 seconds: 15.502029sec
time taken by remove with 1 threads and sleep 0.0001 seconds: 15.520141sec
time taken by insert with 2 threads and sleep 0.0001 seconds: 7.765034sec
time taken by remove with 2 threads and sleep 0.0001 seconds: 7.767849sec
time taken by insert with 4 threads and sleep 0.0001 seconds: 3.891609sec
time taken by remove with 4 threads and sleep 0.0001 seconds: 3.895309sec
time taken by insert with 8 threads and sleep 0.0001 seconds: 1.945151sec
time taken by remove with 8 threads and sleep 0.0001 seconds: 1.948949sec
time taken by insert with 16 threads and sleep 0.0001 seconds: 0.998574sec
time taken by remove with 16 threads and sleep 0.0001 seconds: 0.979559sec

time taken by insert with 1 threads and sleep 0.001 seconds: 111.163769sec
time taken by remove with 1 threads and sleep 0.001 seconds: 111.636538sec
time taken by insert with 2 threads and sleep 0.001 seconds: 56.064795sec
time taken by remove with 2 threads and sleep 0.001 seconds: 56.531595sec
time taken by insert with 4 threads and sleep 0.001 seconds: 28.136038sec
time taken by remove with 4 threads and sleep 0.001 seconds: 28.367063sec
time taken by insert with 8 threads and sleep 0.001 seconds: 14.123047sec
time taken by remove with 8 threads and sleep 0.001 seconds: 14.066496sec
time taken by insert with 16 threads and sleep 0.001 seconds: 7.071987sec
time taken by remove with 16 threads and sleep 0.001 seconds: 7.050332sec