6

ARMプロセッサを搭載したRaspberryPiでPercona(MySQLバリアント)をコンパイルしています。

コンパイル中に報告された問題が発生しましたが、ARMはサポートされていないプラットフォームであるため、誰も修正する気がありません。

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

この問題を回避して正常にコンパイルできましたが、c ++に関する知識がやや不足しており、実際に何かが壊れているかどうかが完全にはわかりません。

SOに関するconstchar*から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;

これはミューテックスであると想定されているため、おそらくこれをスレッドセーフではないと感じています。それともこれで大丈夫ですか?

より良い解決策はありますか?

4

1 に答える 1

10

クラスでは、メンバーデータを次のように宣言しているようです。

pthread_mutex_t time_collector_lock;

したがって、constメンバー関数では、このメンバーデータは次のように宣言したかのようになります。

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

非constオブジェクトへのポインタを期待しているconstオブジェクトにポインタを渡すことができないため、これが問題の原因です。my_atomic_rwlock_rdlock()

キーワード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!
于 2012-07-16T09:59:06.657 に答える