【问题标题】:Acess boost ptree across multiple threads跨多个线程访问 boost ptree
【发布时间】:2014-02-19 12:08:14
【问题描述】:
我想创建一个系统,将 XML 文件中的选项加载到 ptree 中,并跨多个线程访问这个 ptree。
到目前为止,我已经创建了一个简单的类,每个线程都可以访问它,它包含方法 put(id) 和 get()。
不幸的是,ptree 似乎不是线程安全的,所以程序经常崩溃。
有没有办法使 ptree 线程安全?还是有更好的解决方案?
【问题讨论】:
标签:
c++
xml
boost
thread-safety
boost-propertytree
【解决方案1】:
您可以使用 guardian 模板结构描述 int this blog post。
基本上,您将创建一个guardian<ptree>,而不是一个普通的ptree。守护者是一个不透明的结构,它在其数据旁边保存一个mutex。访问数据的唯一方法是通过guardian_lock,这将锁定mutex。
guardian<ptree> xml;
//thread 1
{
guardian_lock<ptree> lock(xml);
lock->put("a", "b");
}
//thread 2
{
guardian_lock<ptree> lock(xml);
lock->put("c", "d");
}
由于您只能通过锁访问内部ptree,并且锁会锁定互斥体,因此您将永远不会有竞争条件。