Здравствуйте, NKZ, Вы писали:
NKZ>Я думаю просто очищать очередь во время сериализации (метод закрыть мютексом). Вообщем убрать консантность и копирование в save_queue. Фиг с ним с бустом, так эффекивнее
понятно
NKZ>А вообще зачем сериализовать объекты синхронизации? Почему они будут невалидными?
А как будет инициализирован семафор ? ведь од изменяет свое состояние мотодами push и pop. А тут сериализация минует эти методы
NKZ>Видимо я просто не до конца понимаю ваш алгоритм работы с сериализованными данными, когда они нужны и кому (и нужны ли вообще, потому что после того, как очередь изменится они станут невалидными).
Вот пример (на непонятные типы не обращай внимания — думаю суть будет понятна)
Например LimitQueue и организована на std::queue
template <typename T>
class MonitorQueue : public IRQueue<T>, public IWQueue<T> {
private:
friend class boost::serialization::access;
static const unsigned WAIT_TIME = 100;
static const unsigned QUEUE_SIZE = 50 * 1000;
LimitQueue<T> m_queue;
boost::mutex m_mutex;
Semaphore m_semaphore;
template <class Archive>
void serialize (Archive& archive, const unsigned int version)
{
boost::mutex::scoped_lock lock(m_mutex);
archive & BOOST_SERIALIZATION_NVP (m_queue);
}
virtual void OnOverflow (const T& value) const
{
FileStream fs ("overflow.dbg");
fs << "Overflow buffer" << std::endl;
}
public:
typedef IRQueue<T> TRQueue;
typedef IWQueue<T> TWQueue;
explicit MonitorQueue (std::size_t size = QUEUE_SIZE)
: m_queue (size), m_semaphore (0, (unsigned)size, WAIT_TIME) {}
virtual ~MonitorQueue() {}
virtual void push (const T& value)
{
boost::mutex::scoped_lock lock(m_mutex);
if (m_queue.full())
{
OnOverflow(value);
return;
}
m_queue.push(value);
m_semaphore.unlock();
}
virtual bool pop (T& value)
{
if (!m_semaphore.lock()) return false;
boost::mutex::scoped_lock lock(m_mutex);
_ASSERTE(!m_queue.empty());
value = m_queue.pop();
return true;
}
};
Пусть семафор имеет 30 свободных состояний.
В этот момент происходит сериализация. Очередь чистится.
1.Очистка очереди не может осуществляться методом pop, т.к. произойдет дедлок. Тоесть после очистки нужно еще сбросить семафор.
2. На друго стороне произошла десериализация. Какое состояние имеет семафор ? кто его будет инициализировать ?
Тоесть получается что его инициализация обязательно должна быть в методе сериализации