Skip to content

even faster unlock in contention#462

Open
BusyJay wants to merge 1 commit intoAmanieu:masterfrom
BusyJay:even-faster-unlock
Open

even faster unlock in contention#462
BusyJay wants to merge 1 commit intoAmanieu:masterfrom
BusyJay:even-faster-unlock

Conversation

@BusyJay
Copy link
Copy Markdown

@BusyJay BusyJay commented May 8, 2025

This is an alternative more aggressive implementation of idea #461.

Compared to #461, this PR

  • maintains parked bit on waiter side, so that waker doesn't have to atomic operation twice.
  • reset all lock states back to 0 when unlock. This makes fast lock more likely succeed during high contention.
  • set PARKED_BIT even waiter is prevented from sleep, so that more threads can be woken up during contention to compete for progress.

Running cargo run --bin mutex --release -- 9:36:9 5 5 2 2:

Running with 9 threads

name average median std.dev.
parking_lot::Mutex (this pr) 472.082 kHz 475.676 kHz 13.820 kHz
parking_lot::Mutex (pr 461) 405.134 kHz 406.469 kHz 9.105 kHz
parking_lot::Mutex (master) 364.841 kHz 365.127 kHz 11.269 kHz
std::sync::Mutex 769.754 kHz 767.714 kHz 23.908 kHz
pthread_mutex_t 982.966 kHz 989.991 kHz 31.816 kHz

Running with 18 threads

name average median std.dev.
parking_lot::Mutex (this pr) 352.643 kHz 353.062 kHz 7.842 kHz
parking_lot::Mutex (pr 461) 268.530 kHz 268.355 kHz 5.586 kHz
parking_lot::Mutex (master) 82.786 kHz 82.975 kHz 2.435 kHz
std::sync::Mutex 389.199 kHz 394.549 kHz 21.358 kHz
pthread_mutex_t 482.005 kHz 489.225 kHz 26.404 kHz

Running with 27 threads

name average median std.dev.
parking_lot::Mutex (this pr) 231.691 kHz 231.891 kHz 3.014 kHz
parking_lot::Mutex (pr 461) 185.802 kHz 186.233 kHz 2.598 kHz
parking_lot::Mutex (master) 28.246 kHz 28.306 kHz 0.443 kHz
std::sync::Mutex 280.553 kHz 280.014 kHz 10.115 kHz
pthread_mutex_t 311.815 kHz 311.582 kHz 8.409 kHz

Running with 36 threads

name average median std.dev.
parking_lot::Mutex (this pr) 157.511 kHz 157.183 kHz 1.764 kHz
parking_lot::Mutex (pr 461) 134.010 kHz 133.784 kHz 1.509 kHz
parking_lot::Mutex (master) 22.055 kHz 22.059 kHz 0.150 kHz
std::sync::Mutex 193.672 kHz 195.078 kHz 10.369 kHz
pthread_mutex_t 224.436 kHz 225.767 kHz 12.334 kHz

Running cargo run --bin rwlock --release -- 36 9 5 5 2 2

name write read
parking_lot::RwLock (this pr) 6805.309 kHz 1334.018 kHz
parking_lot::RwLock (pr 461) 6121.347 kHz 968.373 kHz
parking_lot::RwLock (master) 628.062 kHz 954.938 kHz
seqlock::SeqLock 648.979 kHz 152225.000 kHz
pthread_rwlock_t 1678.253 kHz 376.558 kHz

Using lock-bench, cargo run --release 32 2 10000 100:

name avg min max
std::sync::Mutex 30.795793ms 28.369313ms 33.668656ms
parking_lot::Mutex (this pr) 32.460918ms 29.497656ms 34.424228ms
parking_lot::Mutex (pr 461) 40.800542ms 37.16543ms 44.621677ms
parking_lot::Mutex (master) 206.836045ms 183.902676ms 213.697023ms
spin::Mutex 63.898884ms 58.45244ms 74.323676ms
AmdSpinlock 70.131547ms 65.356139ms 83.456119ms
name avg min max
std::sync::Mutex 30.52266ms 28.69828ms 34.945486ms
parking_lot::Mutex (this pr) 31.257888ms 29.648337ms 33.955286ms
parking_lot::Mutex (pr 461) 41.146074ms 38.453175ms 42.433051ms
parking_lot::Mutex (master) 210.387478ms 187.38791ms 215.752182ms
spin::Mutex 62.823716ms 54.801191ms 74.31628ms
AmdSpinlock 68.937325ms 55.406785ms 80.83359ms

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants