2013-05-22 19 views
6

anziché sizeof(std::atomic<bool>)==1?Perché sizeof (std :: mutex) == 40 (gcc, clang, icc)?

Un mutex potrebbe essere implementato tramite un semplice std::atomic<bool>, quindi penserei che la dimensione di un mutex potrebbe essere piccola come quella, o forse 4 (32 bit).

+0

"Un mutex potrebbe essere implementato tramite un semplice' std :: atomic '" non significa che è l'implementazione ottimale. –

+2

'atomic ' è un mutex 'di un uomo povero ... Voglio dire, ** davvero ** quello di un uomo povero. – Griwes

+3

Mi chiedo perché alcuni considerano questa domanda poco chiara o non utile. –

risposta

11

Con uno bool è possibile implementare solo un spin-lock. Si noti che sarebbe un blocco ingiusto perché nulla garantisce che i camerieri si accodano, quindi c'è una possibilità che, in caso di alta contesa nel caso più estremo, un thread potrebbe essere bloccato per sempre perché perderebbe sempre la corsa per acquisire il blocco.

Un'implementazione mutex richiede il supporto del sistema operativo per consentire la sospensione dei thread in attesa. Quindi, un mutex necessiterebbe di un flag che indichi se è bloccato e qualche forma di un descrittore di code che consente di mettere i thread in attesa a dormire e svegliarli. Se si desidera che il mutex sia in grado di supportare il blocco ricorsivo, la robustezza, la rotazione opzionale, la protezione da inversione di priorità, ecc., Occorrerebbero ancora più membri.

+0

Ma con un atomico 'int' e una chiamata di sistema come' futex' su Linux, è possibile implementare un mutex appropriato. –

+0

@ MikeSeymour Non proprio. –

+0

Intendi "No, non puoi", o "Non proprio, dal momento che stai usando una memoria del kernel e lo spazio utente' int' "? Dovrò essere in disaccordo se intendi il primo. –

11

La libreria GNU di solito utilizza i thread Posix per implementare la libreria di thread standard. Questo utilizza un singolo tipo pthread_mutex_t per rappresentare diversi tipi di mutex; quindi contiene vari campi necessari per mutex più complessi (ad esempio un contatore per mutex ricorsivi), più un campo per specificare il tipo.

Hai ragione che, in linea di principio, con un supporto adeguato dal sistema operativo, un std::mutex potrebbe utilizzare un solo byte di memoria utente. (Su Linux, deve essere un int e su altre piattaforme potrebbe essere un intero o un handle di dimensioni puntatore a una risorsa del kernel). Presumibilmente, si è ritenuto che i benefici derivanti dall'implementazione di un'implementazione ben collaudata superassero i benefici del salvataggio di alcune dozzine di byte per mutex.

6

Un mutex potrebbero essere attuate tramite un semplice std::atomic<bool>

Non sembra come una possibilità, se si considera che mutex::lock è un'operazione necessaria, e std::atomic<bool> è più probabile una sorta non bloccabile. È possibile inserire un ciclo while intorno alla chiamata compare_exchange_strong, ma non è lo stesso di mutex::lock, perché spreca la CPU durante l'intero periodo di attesa.

In generale, std::mutex è molto più complesso di un semplice bool comportamento multithread definito, spiegando le sue dimensioni piuttosto grandi, che dipende dal compilatore: per esempio, on ideone the sizeof(mutex) is 24.

Problemi correlati