繁体   English   中英

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

[英]Smart solution for storing data to xml thread-safe with Boost

问题:

我正在使用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编写不会崩溃。

问题

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

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

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

您熟悉boost::asio吗?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM