Possibly wrong readers count in boost::thread_v2::upgrade_mutex
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 48/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- cpp
- Ambito
- operating-systems
Direzione di ricerca
Inizia con upgrade_mutex::try_unlock_shared_and_lock_until e upgrade_mutex::try_unlock_upgrade_and_lock_until, quindi traccia come cambiano state_ e n_readers_ mentre gate2_.wait_until è in attesa. Conferma che il percorso di timeout preservi il numero effettivo di reader dopo che gli altri reader hanno sbloccato, e verifica che entrambi i metodi gestiscano coerentemente lo stato risultante.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Because of issues (https://github.com/boostorg/thread/issues/265, https://github.com/boostorg/thread/issues/361) in the default shared mutex implementation, I reviewed the code of the V2 mutex classes.
It seems like upgrade_mutex::try_unlock_shared_and_lock_until(const boost::chrono::time_point<Clock, Duration>& abs_time) and upgrade_mutex::try_unlock_upgrade_and_lock_until(const boost::chrono::time_point<Clock, Duration>& abs_time) can set the readers count to a wrong value.
Both functions contain the same piece of code:
count_t num_readers = (state_ & n_readers_) - 1;
state_ &= ~n_readers_;
state_ |= (write_entered_ | num_readers);
if (!gate2_.wait_until(lk, abs_time, boost::bind(
&upgrade_mutex::no_readers, boost::ref(*this))))
{
++num_readers;
state_ &= ~(write_entered_ | n_readers_);
state_ |= num_readers;
The problem is with ++num_readers. Between reading it out of the state and then setting it again, the mutex is unlocked, so readers can unlock_shared(). This is even necessary, as the code actually waits until the readers count reaches 0.
So IMHO, the line in question should read:
num_readers = (state_ & n_readers_) +1;
- Lingua principale
- C++
- Stelle
- 213
- Fork
- 171
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di boostorg/thread
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 65/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 64/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 42/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 58/100
Tutte le issue di boostorg/thread
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
AXERA-TECH/ax-llm#77 ·
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
games-on-whales/wolf#509 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
-
bug-unconfirmed
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
NVIDIA/cuda-samples#453 ·