问题:
我正在开发一个带有 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写入不会崩溃。
问题:
答案 0 :(得分:3)
这完全取决于主线程正在做什么以及程序的设计和实现方式。
您建议的解决方案可以正常工作,但它只是为了处理对xml文件的写入而占用一个线程。
您熟悉boost::asio
吗?
在任何服务器中,我都会将boost::asio
与单个线程或调用ioservice::run
的线程池一起使用。对xml文件的更新被“发布”到asio事件循环,并由其线程池中的任何工作线程(即调用ioserive :: run的线程)调度/执行。这意味着您的系统使用较少的线程,并且它使用的线程能够执行大量异步操作。
注意:boost::asio::post
用于在asio事件循环中调用函数,这允许您控制/序列化对xml文件的访问