8

问题:

我正在使用Boost开发服务器,并且有一个 xml 文件,主线程在初始化时从该文件中加载一些数据。

在执行期间,可能会发生一些更改,应将其存储在 xml 文件中。为此,在名为 Database 的类中实现了函数 store():

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 写入不会崩溃。

问题

  • 对于此类问题是否有更有效或更好的解决方案,或者这是正确的方法?
4

1 回答 1

3

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

您提出的解决方案可以正常工作,但它只占用一个线程来处理对 xml 文件的写入。

你熟悉boost::asio吗?

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

注意:boost::asio::post用于在 asio 事件循环中调用一个函数,这允许您控制/序列化对 xml 文件的访问

看: boost::asio boost::asio::post

于 2012-11-15T11:12:07.137 回答