私はサーバースレッドと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
私はこれを解決できる方法上の任意の洞察力が...
を理解されるであろうジュリアン。
提案:appConfigクラス/ structの内部でmutexを移動し、getterメソッドとsetterメソッドでロックを実行させます。クライアントにロック/ロック解除を覚えさせるように強制するのは面倒でエラーが起こりやすいでしょう。 – Lalaland
それは本当に良いアイデアです、私はちょうど設定のためのクラスを使用する必要があります。これが解決された後に試してみます(この種の問題を解決できないのが私を不思議にさせます) –