C++ 增加线程资源和互斥锁

C++ 增加线程资源和互斥锁,c++,boost,boost-thread,C++,Boost,Boost Thread,我正在实现一个简单的线程应用程序,其中有一个服务器线程和一个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() {

我正在实现一个简单的线程应用程序,其中有一个服务器线程和一个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;
}
任何关于我如何解决这个问题的见解都将不胜感激


Julian。

这本身并不是一个真正的boost问题:您在头中声明了一个全局变量,因此在两个编译单元的全局范围中都定义了该变量,从而导致了多个定义


在头文件中声明它
extern
,并在一个.cpp文件中定义它应该是可行的。

这本身并不是一个真正的boost问题:您在头文件中声明了一个全局变量,因此在两个编译单元的全局范围中都定义了该变量,从而导致了多个定义


在头文件中声明它
extern
,并在一个.cpp文件中定义它应该是可行的。

建议:将互斥体移动到appConfig类/结构中,并让它对getter和setter方法执行锁定。强制客户机记住锁定/解锁将是一件混乱且容易出错的事情。这是一个非常好的主意,我只需要使用一个类来进行配置。解决此问题后将尝试(无法解决这种让我好奇的问题)建议:将互斥体移动到appConfig类/结构中,并让它对getter和setter方法执行锁定。强制客户机记住锁定/解锁将是一件混乱且容易出错的事情。这是一个非常好的主意,我只需要使用一个类来进行配置。解决后会尝试(无法解决此类问题会让我好奇)
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