使用Boost将数据存储到xml线程安全的智能解决方案

时间:2012-11-15 08:19:41

标签: c++ xml boost thread-safety

问题:

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

在执行期间,可能会发生一些更改,并且应该存储在xml文件中。为此,函数store()在名为Database:

的类中实现
Database::store()
{
   boost::mutex::scoped_lock lock(_databaseMutex);  
   //xml file wirting   
} 

如果我想存储与创建类Database (例如套接字连接)的主不同的其他线程的更改,则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写入不会崩溃。

问题

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

1 个答案:

答案 0 :(得分:3)

这完全取决于主线程正在做什么以及程序的设计和实现方式。

您建议的解决方案可以正常工作,但它只是为了处理对xml文件的写入而占用一个线程。

您熟悉boost::asio吗?

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

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

请参阅: boost::asio boost::asio::post