2012-11-15 194 views
8

问题:智能解决方案

我开发与升压服务器,并有从一些数据由主线程在初始化加载XML文件。

在执行过程中可能会发生一些变化,应该存储在xml文件中。为此函数存储()中的一类叫做数据库实现:

Database::store() 
{ 
    boost::mutex::scoped_lock lock(_databaseMutex); 
    //xml file wirting 
} 

如果我想存储变化从另一个线程从谁创建的类数据库主要不同(套接字连接,例如),xml失败,因为它似乎是线程不安全的。

更多钞票的解决方案:

我的想法是建立在服务器(主线程)循环中,等待其他线程的通知,是这样的:

void loopQueue() 
{ 
    boost::mutex::scoped_lock lock(_queueMutex);  // close the lock  
    while(true) 
    { 
     while (_queuedActions.empty()) 
     { 
      _updateAvailable.wait(lock); 
     }   
     getDatabase(param)->store();  //stores database 
     _queuedActions.pop(); 
    } 
} 

这样XML写呢不会崩溃。

问题

  • 是否有此类问题的更有效或更好的解决方案或这是正确的方式?

回答

3

这一切都取决于主线程在做什么以及如何设计和实现程序。

你提出的解决方案可以很好地工作,但它仅仅为了处理对xml文件的写入而占用一个线程。

您是否熟悉boost::asio

在任何服务器上,我都会使用boost::asio与单线程或调用ioservice::run的线程池。对xml文件的更新“发布”到asio事件循环中,并由其线程池中的任何工作线程(即调用ioserive :: run的线程)分派/执行。这意味着你的系统使用较少的线程,它所使用的线程能够执行大量的异步操作。

注:boost::asio::post用于有一个叫ASIO事件循环中的功能,这可以让你控制/序列化到XML文件访问

参见: boost::asio boost::asio::post

+1

我读这个主题,它看起来很有趣,也适用于每个连接一个线程。 –

+1

最好的方法是使用线程池。如果您的服务器需要处理大量不同的连接(例如处理1000个呼叫的VOIP交换机),则每个连接产生一个线程不会扩展。提供'boost :: asio'的例子涵盖了简单和复杂的情况,不幸的是一些更复杂的情况没有解释/记录。这里有一些优秀的资源,它们解释了用'boost :: asio'开发多线程服务器的不同技术。恕我直言'boost :: asio'是我用过的最好的书面/最可用的C++库之一。 – mark