Jav*_*ock 8 c++ xml boost thread-safety
问题:
我正在使用Boost开发一个服务器,并且有一个xml文件,主线程在初始化时会从中加载一些数据.
在执行期间,可能会发生一些更改,并应存储在xml文件中.为此,函数store()在名为Database的类中实现:
Database::store()
{
boost::mutex::scoped_lock lock(_databaseMutex);
//xml file wirting
}
Run Code Online (Sandbox Code Playgroud)
如果我想存储来自另一个不同于创建类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();
}
}
Run Code Online (Sandbox Code Playgroud)
这样xml写入不会崩溃.
问题:
这一切都取决于主线程在做什么以及程序是如何设计和实现的。
您提出的解决方案可以正常工作,但它会占用一个线程来处理对 xml 文件的写入。
你熟悉吗boost::asio?
在任何服务器中,我都会使用boost::asio单个线程或线程池来调用ioservice::run. 对 xml 文件的更新被“发布”到 asio 事件循环,并由其线程池中的任何工作线程(即调用 ioserive::run 的线程)分派/执行。这意味着您的系统使用更少的线程,并且它使用的线程能够执行大量异步操作。
注意:boost::asio::post用于在 asio 事件循环内调用一个函数,这允许您控制/序列化对 xml 文件的访问
看:
boost::asio
boost::asio::post