2012-07-16 9 views
6

Je compile Percona (variante MySQL) sur mon Raspberry Pi, qui a un processeur ARM.Travailler autour de conversion invalide de const

J'ai rencontré un problème lors de la compilation qui a été signalé, mais personne n'est prêt à corriger car ARM est une plate-forme non prise en charge.

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

J'ai réussi à contourner le problème et de compiler avec succès, mais ma connaissance de C++ est un peu manque et je ne comprends pas bien si je l'ai fait cassé quelque chose ou non. J'ai lu beaucoup de la conversion invalide de const char * à char * questions sur SO, qui est l'endroit où j'ai eu l'idée de cette solution de contournement.

L'erreur était comme suit:

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

(il était en fait pas pthread_mutex_t sur ma plate-forme, mais la question est la même - type réel perdu à l'abîme infini qui est le tampon de scrollback)

Le code incriminé était:

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

Je changé cela:

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

time_collector_lock est défini comme:

private: 
    my_atomic_rwlock_t time_collector_lock; 

En raison du fait cela est censé être un mutex, j'ai un sentiment que j'ai probablement fait ce non-thread-safe. Ou est-ce correct?

Existe-t-il une meilleure solution?

+0

Pourquoi ne pas utiliser 'const_cast'? Vous allez rendre votre ** intention ** claire et vous ne créerez pas une ** copie ** de pthread_mutex_t ... –

+0

Si vous essayez de 'const_cast' un objet initialement déclaré comme' const', le résultat est UB – SingerOfTheFall

+0

@SingerOfTheFall Le but de ** only ** de const_cast est de supprimer le const. –

Répondre

10

Il semble, dans la classe, vous avez déclaré les données membres comme:

pthread_mutex_t time_collector_lock; 

donc dans la fonction membre const, ces données membre devient comme si vous avez déclaré comme:

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

qui est à l'origine du problème, comme vous ne pouvez pas passer le pointeur à const objet à my_atomic_rwlock_rdlock() qui pointeur attend à non const objet.

Le mot-clé mutable peut vous sauver ici. Déclarer les données membres comme mutable objet comme:

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

vous pouvez maintenant utiliser les données membres dans const fonction membre ainsi:

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

J'ai ce motif. Les verrous et autres ne font pas partie de l'état logique d'un objet (en effet, leur utilisation est de préserver son état logique), donc ils devraient être mutables si nécessaire. –

+3

Il est en fait défini comme 'my_atomic_rwlock_t time_collector_lock;' l'ajout de 'mutable' a fait l'affaire. Merci beaucoup! – Leigh

Questions connexes