Re[8]: сериализация std::queue
От: k732  
Дата: 20.07.07 12:50
Оценка:
Здравствуйте, 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 не очень бы хотелось. Может дружественная функция иди еще что...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.