我想创建一个系统,将XML文件中的选项加载到ptree中,并在多个线程中访问该ptree。
Sofar,我很生气一个简单的类,每个线程都可以访问它,其中包含方法put(id)和get()。
不幸的是,ptree似乎不是线程安全的,因此程序崩溃了很多。
有没有办法使ptree线程安全?还是有更好的解决方案?
最佳答案
您可以使用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
,并且锁将锁定互斥锁,所以您永远不会出现争用条件。