2012-01-12 100 views
0

我正在實現一個簡單的線程應用程序,其中有一個服務器線程和一個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 

對我怎麼能解決這個問題的任何見解將不勝感激...

朱利安。

+1

建議:在appConfig類/結構中移動互斥鎖,並讓它對getter和setter方法執行鎖定。強迫客戶記住鎖定/解鎖將變得混亂和容易出錯。 – Lalaland 2012-01-12 04:29:11

+0

這真是一個好主意,我只需要使用一個類來進行配置。這個解決之後會試試(不能解決這種好奇) – 2012-01-12 04:32:44

回答

3

這實際上並不是一個提升問題:你已經在頭文件中聲明瞭一個全局變量,因此這兩個編譯單元都在全局範圍內定義了這個變量,從而導致了多個定義。

在頭文件中聲明它extern,並在一個.cpp文件中定義它應該工作。

+0

它當時做了,對延遲接受抱歉。 – 2012-01-17 02:41:44