2012-07-16 40 views
6

我在我的Raspberry Pi上编译了Percona(MySQL变体),它有一个ARM处理器。解决const的无效转换问题

我在编译过程中遇到了一个报告过的问题,但没人愿意修复,因为ARM是不受支持的平台。

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

我已经设法解决这个问题,并编译成功,但我的C++的知识有所欠缺,我不完全明白,如果我实际上已经打碎了什么东西或没有。

我已经阅读了很多从const char *到char *的无效转换,这是我得到这个解决方法的想法的地方。

错误如下:

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

(它实际上不是pthread_mutex_t我的平台上,但问题是相同的 - 实际类型输给了无限的深渊是滚动缓冲区)

有问题的代码是:

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

我把它改为:

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

time_collector_lock被定义为:

private: 
    my_atomic_rwlock_t time_collector_lock; 

由于这应该是互斥的事实,我有我可能使这个非线程安全的感觉。或者这可以吗?

有没有更好的解决方案?

+0

为什么不使用'const_cast'?你将使你的**意图清晰**,并且你不会创建pthread_mutex_t的**副本... – 2012-07-16 09:57:16

+0

如果你试图将最初声明为const的一个对象const_cast,结果是UB – SingerOfTheFall 2012-07-16 10:01:36

+0

@SingerOfTheFall **只有** const_cast的目的是去掉const。 – 2012-07-16 10:02:51

回答

10

看来,在类,声明该成员数据:

pthread_mutex_t time_collector_lock; 

所以在const成员函数,该成员的数据变得仿佛你已经宣布它为:

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

这是造成问题,因为你不能传递指针常量对象my_atomic_rwlock_rdlock()这是期待指针非const对象。

关键字mutable可以将您保存在这里。宣布该成员数据mutable对象为:

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

现在你可以在const成员函数中使用成员数据,以及:

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

我有这种模式。锁等不是对象逻辑状态的一部分(事实上,它们的用途是保持其逻辑状态),所以在必要时应该是可变的。 – 2012-07-16 10:02:45

+3

它实际上被定义为'my_atomic_rwlock_t time_collector_lock;'添加'可变'做了诀窍。非常感谢! – Leigh 2012-07-16 10:11:48

相关问题