Я хотел бы создать систему, которая загружает параметры из XML файла в ptree и обрабатывает этот ptree через несколько потоков. Sofar, я имею безумный простой класс, доступный для каждого потока, который содержит методы put (id) и get(). К сожалению, ptree не является потокобезопасным, поэтому программа сильно падает. Есть ли способ сделать ptree threadsafe? Или есть лучшее решение для всех вместе?
Вы можете использовать структуру шаблонов-хранителей, описанную в этом сообщении блога.
В принципе, вы создадите 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
через замок, а блокировка блокирует мьютекс, у вас никогда не будет условий гонки.