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