2011-01-26 11 views
1

C++でSQLテーブルを記述する定義リストを作成する必要があります。現時点では私は初期化する場合は、この方法でそれは本当に本当のオブジェクトである必要はありません、それはかなり便利であるとして、このようにそれをやっている:静的定義リスト

namespace Table_name 
{ 
    static ColumnList Cols("Table_name"); 
    static const Column Id  ("Id INTEGER PRIMARY KEY", Cols); 
    static const Column Col_name ("Col_name TEXT", Cols); 
} 

(外側の名前空間を、usingなど省略)

各列がリストに登録されるように、各コンストラクターにColsを渡します。私はリストを得るためにTable_name::Col_nameまたはTable_name::Colsとして両方を使用します。当時はかなりうまくいっていましたが、最終的に発生する可能性のある静的変数へのマルチスレッドアクセスのためにいくつかの問題があることに気付きました。または、これらの問題はローカル静的変数にのみ関連していますか?

これを安全にするために、どうやってこれをやり直すことができますか?同様に便利な定義と列変数とそのリストへのアクセスはありますか?私は各列が単一の場所で定義されると期待しているので、列挙型、 "通常の"変数などは動作しません。また、DEF_COL(Col_name, "...");のようなマクロの使用がこの場合適切であると思いますか?ありがとう。

答えて

1

これはあなたが静的初期化の未定義の順

に関連するいかなる問題も、あなたが、彼らはテーブル構造定義の問題

+0

シングルトンを使用するとリストの簡単な定義を持つことができません...私はMySql ++のSSQLをチェックしました。マクロを使用してこれを達成しました//次は非常に複雑なマクロを呼び出します。マクロは適切です:)何か簡単な方法が必要ですが、とにかく参考に感謝します。 –

+0

ええ、マクロはこのような場合によく使用されます。あなたの仕事を簡素化するためにBoost Preprocessor(http://www.boost.org/doc/libs/1_45_0/libs/preprocessor/doc/index.html)を見てください。このライブラリは本当に複雑なマクロをサポートしています –

1
の解決方法を確認するために MySql++ライブラリを確認することができていないことを確認するためにのためにあなたがシングルトンを使用することができます

オブジェクト内で必要な同期を提供できます。ただし、実行時にテーブル定義が実際に変更されない限り、これらは自動的にMTに対して安全です。

+0

私はMTで初期化の問題があるかもしれないと思っていましたが、同じコンパイル単位内に問題はありませんでしたか?ちなみに、私はちょうど別のコンパイル単位でその定義が必要だと思ったので、これはうまくいかず、何か他のものを見つけなければならないでしょう:\ –

+0

一方のスレッドが他方のデータを読み込んでいるので、それに書き込むと、一貫性のない見方につながります。データが変更されない場合は、並行性の問題はありません。データが変更された場合は、その横にロックを配置します。 –

+0

@Simon:申し訳ありませんが私は混乱していましたが、実際に私が意味したのは、この静的初期化問題です。http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14 MTには関係しませんが、この記述を使用して他の静的変数を初期化することができますので、私の場合は問題になります。 –

関連する問題