跨多个线程访问boost ptree

时间:2014-02-19 12:08:14

标签: c++ xml boost thread-safety boost-propertytree

我想创建一个系统,它将XML文件中的选项加载到ptree中,并在多个线程中访问此ptree。 Sofar,我疯了一个简单的类,每个线程都可以访问,包含方法put(id)和get()。 不幸的是,ptree似乎并不是线程安全的,所以程序崩溃了很多。 有没有办法让ptree线程安全?或者是否有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

您可以使用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,而锁锁定互斥锁,你将永远不会有竞争条件。