2012-01-12 11 views
0

私はサーバースレッドとGUIスレッドを持つ単純なスレッドアプリケーションを実装しています。そう、事は少しこのように書きます:ブーストスレッドのリソースとmutex

int main(int argc, char *argv[]) { 
    appMain app(argc, argv); 
    return app.exec(); 
} 

appMain::appMain(int c, char **v) : argc(c), argv(v) { 
    this->Configuration(); 
} 

int appMain::exec() { 
    appServer Server; 

    try { 
     ServerThread = boost::thread(Server); 

     ServerThread.join(); 
    } catch (...) { 
     return EXIT_FAILURE; 
    } 

    return 0; 
} 

appMain::Configuration方法はただstruct appConfigへのコンフィギュレーション・ファイルをロード、それを拾います。問題は、私はこの構造体を使用する場所から変更可能にする必要があります。つまり、メモリ破壊を避けるためにミューテックスを使用する必要があります。 は、すべての可能なポインタの問題を回避し、スレッド引数(一種の痛い思われる)を渡すことを期待して、私はappConfig.hで宣言されたグローバル変数、使用することを決めた:

struct appConfig config; 
boost::mutex configMutex; 

をこのように私は私のextern宣言場所を追加しました私はそれらを使用する:

appMain.cpp

extern struct appConfig config; 
extern boost::mutex configMutex; 

appServer.cpp

extern struct appConfig config; 
extern boost::mutex configMutex; 

appServer::appServer() { 
    return; 
} 

void appServer::operator()() { 
    configMutex.lock(); 
    cout << "appServer thread." << endl; 
    configMutex.unlock(); 
} 

appServer::~appServer() { 
    return; 
} 

コンパイル時に問題のいずれかの種類があってはならないように私には思われるが、まだ私はこの素敵な贈り物を取得:

appServer.o: In function `~appServer': 
/usr/include/boost/exception/detail/exception_ptr.hpp:74: multiple definition of `configMutex' 
appMain.o:/home/eax/CCITP/src/appMain.cpp:163: first defined here 
appServer.o: In function `appServer': 
/usr/include/boost/exception/exception.hpp:200: multiple definition of `config' 
appMain.o:/usr/include/c++/4.6/bits/stl_construct.h:94: first defined here 
collect2: ld returned 1 exit status 

私はこれを解決できる方法上の任意の洞察力が...

を理解されるであろう

ジュリアン。

+1

提案:appConfigクラス/ structの内部でmutexを移動し、getterメソッドとsetterメソッドでロックを実行させます。クライアントにロック/ロック解除を覚えさせるように強制するのは面倒でエラーが起こりやすいでしょう。 – Lalaland

+0

それは本当に良いアイデアです、私はちょうど設定のためのクラスを使用する必要があります。これが解決された後に試してみます(この種の問題を解決できないのが私を不思議にさせます) –

答えて

3

これは本当に大きな問題ではありません。つまり、両方のコンパイル単位でグローバルスコープで定義されたヘッダーにグローバル変数が宣言され、複数の定義につながります。

ヘッダにexternと宣言し、それを正確に1つの.cppファイルで定義すると動作するはずです。

+0

当時は遅れて申し訳ありませんでした。 –

関連する問題