2012-07-16 19 views
6

Sto compilando Percona (variante MySQL) sul mio Raspberry Pi, che ha un processore ARM.Utilizzo della conversione non valida da const

Ho riscontrato un problema durante la compilazione che è stato segnalato, ma nessuno è disposto a risolvere perché ARM è una piattaforma non supportata.

https://bugs.launchpad.net/percona-server/+bug/1002848

sono riuscito a risolvere il problema e con successo la compilazione, ma la mia conoscenza di C++ è un po 'carente e io non comprendere appieno se ho effettivamente rotto qualcosa o no.

Ho letto molte conversioni non valide da const char * a char * domande su SO, che è dove ho avuto l'idea di questa soluzione alternativa.

L'errore è stato il seguente:

error: invalid conversion from 'const pthread_mutex_t*' to 'pthread_mutex_t*' 

(in realtà non era pthread_mutex_t sulla mia piattaforma, ma il problema è lo stesso - tipo effettivo perso l'abisso infinito che è l'scorrimento all'indietro del buffer)

Il codice incriminato era:

uint32 count(uint index) const 
    { 
    my_atomic_rwlock_rdlock(&time_collector_lock); 

l'ho cambiato a:

uint32 count(uint index) const 
    { 
    my_atomic_rwlock_t dummy = time_collector_lock; 
    my_atomic_rwlock_rdlock(&dummy); 

time_collector_lock è definito come:

private: 
    my_atomic_rwlock_t time_collector_lock; 

A causa del fatto che questo dovrebbe essere un mutex, ho la sensazione che probabilmente ho fatto questo non-thread-safe. O è ok?

C'è una soluzione migliore?

+0

Perché non usare 'const_cast'? Il tuo ** intento sarà chiaro ** e non creerai una ** copia ** di pthread_mutex_t ... –

+0

Se provi a 'const_cast' un oggetto che è stato inizialmente dichiarato come' const', il risultato è UB – SingerOfTheFall

+0

@SingerOfTheFall Il ** solo ** scopo di const_cast è quello di eliminare il const. –

risposta

10

Sembra, nella classe, si è dichiarato i dati membro come:

pthread_mutex_t time_collector_lock; 

modo nella funzione const membro, questi dati utente diventa come se hai dichiarato come:

const pthread_mutex_t time_collector_lock; //(as-if declaration) 

che sta causando il problema, in quanto non è possibile passare puntatore a const oggetto my_atomic_rwlock_rdlock() che si aspetta puntatore a non-const oggetto.

La parola chiave mutable può salvarti qui. Dichiarare i dati membro come mutable oggetto come:

mutable pthread_mutex_t time_collector_lock; 
//^^^^^^note this 

Ora è possibile utilizzare i dati dei membri in const funzione membro così:

uint32 count(uint index) const 
{ 
    my_atomic_rwlock_rdlock(&time_collector_lock); //ok now! 
+2

Ho questo modello. Le serrature e simili non fanno parte dello stato logico di un oggetto (anzi, il loro uso è quello di preservare il suo stato logico), quindi dovrebbe essere mutabile ove necessario. –

+3

In realtà è definito come 'my_atomic_rwlock_t time_collector_lock;' l'aggiunta di 'mutable' ha fatto il trucco. Grazie molto! – Leigh

Problemi correlati