Здравствуйте, NKZ, Вы писали:
NKZ>Я не совсем понял, очередь сериализуется и сериализованные данные отдаются читателям и очередь очишается?
Очередь сериализуется. Полученные данные отправляются потзователю, а сама очередь подчищается, т.к. при сериализации создавалась ее копия. Тоесть данные после отправки не нужны в очереди.
NKZ>В любом случае, надо исходить из эффективности и требований к реализации, так что сигнатуры методов в бусте не являются истинной в последней инстанции
. Еще как менее эффективный вариант, можно очищать очередь в синхронизированном блоке кода, сразу после сериализации.
Да, но тогда не избежать копирования...
З.Ы. Тут возникла еще одна проблемма, на которую я сначала не обратил внимания.
Т.к. очередь у меня синхронизирована, то методы добавления в очередь и извлечения из нее используют объекты синхронизации (мьютекс и семафор), которые я вляются членами-данными класса-очереди.
Естественно сериализовать объекты синхронизации нельзя. А если сериализовать только сам queue, то после десериализации
нельзя будет исподьзовать методы доступа к очереди, т.к. синхро-объекты будут не валидными.
Примерный код
template <typename T, class Container = std::deque <T> >
class Queue {
private :
friend class boost::serialization::access;
boost::mutex m_mutex;
Semaphore m_semaphore;
std::queue <T, Container> m_queue;
template <class Archive>
void serialize (Archive& archive, const unsigned int version)
{
archive & BOOST_SERIALIZATION_NVP (m_queue);
}
public :
Queue () {}
~Queue() {}
void push (const T& obj)
{
m_semaphore/m_mutex;
...
}
void pop (T& obj)
{
m_semaphore/m_mutex;
...
}
};
Как можно с наименьшими усилиями выйти из этой ситуации ? Вводить метод для сериализации самого std::queue в
класс Queue не очень бы хотелось. Может дружественная функция иди еще что...