我正在實現一個簡單的線程應用程序,其中有一個服務器線程和一個gui線程。所以,事情會有點像這樣:提升線程資源和互斥體
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類/結構中移動互斥鎖,並讓它對getter和setter方法執行鎖定。強迫客戶記住鎖定/解鎖將變得混亂和容易出錯。 – Lalaland 2012-01-12 04:29:11
這真是一個好主意,我只需要使用一個類來進行配置。這個解決之後會試試(不能解決這種好奇) – 2012-01-12 04:32:44