Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очередь через кольцевой буфер 
:(
    Опции темы
gpepsi
Дата 3.1.2012, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Есть ли где готовая реализация ?
PM MAIL   Вверх
bsa
Дата 3.1.2012, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



boost
PM   Вверх
_GRIN_
Дата 3.1.2012, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



gpepsi, если я правильно тебя понял - то так:

Код

#circul_buffer_queue.h
#ifndef CIRCUL_BUFFER_QUEUE_H
#define CIRCUL_BUFFER_QUEUE_H

#include <QQueue>

template<class T>class CCirculBufferQueue : public QQueue<T>
{
private:
    uint m_limit;

public:
    inline CCirculBufferQueue(uint buffer_size) : QQueue<T>(),m_limit(buffer_size) {}

    inline void enqueue(const T &t)
    {
        if(m_limit == QQueue<T>::count())
        {
            QQueue<T>::dequeue(); //remove oldest item
        }
        QQueue<T>::enqueue(t);
    }
};

#endif // CIRCUL_BUFFER_QUEUE_H


Код

#main.cpp

#include "circul_buffer_queue.h"
#include <QDebug>
int main()
{
    CCirculBufferQueue<int>cqueue(5);
    for(int i=1;i<=9;i++)
    {
        cqueue.enqueue(i);
        qDebug() << i << ": " << cqueue.count();
    }
    return 0;
}


лог выполнения
Код

1 :  1 
2 :  2 
3 :  3 
4 :  4 
5 :  5 
6 :  5 
7 :  5 
8 :  5 
9 :  5 


P.S. Решение для кьюта - но в stl можно аналогично релизовать

Это сообщение отредактировал(а) _GRIN_ - 4.1.2012, 21:55


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
gpepsi
Дата 13.1.2012, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Хочу усложнить задачу - нужна потоко-безопастная очередь...
PM MAIL   Вверх
bsa
Дата 13.1.2012, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



gpepsi, добавь мьютекс и будет тебе безопасная.
PM   Вверх
gpepsi
Дата 14.1.2012, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



bsa, слишком просто

Код

void push (cosnt T& v)
{
    QMutex;
    ...
}
T pop (void)
{
   QMutex;
   ...
}


Пусть есть один читатель и сотня писателей.
Если у какого писателя после захвата мьютекса произойдет переключение контекста, то все остальные писатели и читатели 
будут курить в холостую
PM MAIL   Вверх
boostcoder
Дата 14.1.2012, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



PM WWW   Вверх
_GRIN_
Дата 15.1.2012, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Цитата(gpepsi @  14.1.2012,  07:03 Найти цитируемый пост)
Пусть есть один читатель и сотня писателей.
Если у какого писателя после захвата мьютекса произойдет переключение контекста, то все остальные писатели и читатели 
будут курить в холостую 


Используй  QReadWriteLock http://developer.qt.nokia.com/doc/qt-4.8/QReadWriteLock.html



--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
boostcoder
Дата 15.1.2012, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(_GRIN_ @  15.1.2012,  00:31 Найти цитируемый пост)
Используй  QReadWriteLock

неправильно.
писатель имеет абсолютную "власть" над читателями. по этому, пока писатель не вернул ресурс, читатели курят.
PM WWW   Вверх
bsa
Дата 15.1.2012, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(gpepsi @  14.1.2012,  10:03 Найти цитируемый пост)
bsa, слишком просто
Но судя по коду ты и этого не осилил.
Цитата(gpepsi @  14.1.2012,  10:03 Найти цитируемый пост)
Если у какого писателя после захвата мьютекса произойдет переключение контекста, то все остальные писатели и читатели 
будут курить в холостую
Поэтому надо делать так, чтобы захват мьютекса происходил на минимальное время (вероятность будет мала).

Это сообщение отредактировал(а) bsa - 15.1.2012, 17:21
PM   Вверх
boostcoder
Дата 15.1.2012, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(bsa @  15.1.2012,  17:02 Найти цитируемый пост)
надо делать так, чтобы захват мьютекса происходил на минимальное время

в данной задаче, полагаю, такой способ будет оправдан. но...
в реально производительной задаче, нужно подбирать гранулярность элементов задачи так, чтоб не было слишком мелких элементов, что приведет к накладным расходам, и чтоб не было слишком больших, ибо это приведет к ухудшению параллелизма.
второе - чтоб добиться максимального параллелизма, каждый поток должен как можно реже работать с общими данными.

Это сообщение отредактировал(а) boostcoder - 15.1.2012, 19:14
PM WWW   Вверх
bsa
Дата 16.1.2012, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



boostcoder, другими словами, ты хочешь сказать, что надо менять вообще способ решения задачи, а не пытаться решить ее крутой кольцевой очередью. Я правильно понял?
PM   Вверх
bsa
Дата 16.1.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



PM   Вверх
boostcoder
Дата 16.1.2012, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



Цитата(bsa @  16.1.2012,  12:22 Найти цитируемый пост)
другими словами, ты хочешь сказать, что надо менять вообще способ решения задачи, а не пытаться решить ее крутой кольцевой очередью. Я правильно понял?

опять же - зависит от задачи.
если задача не критична к производительности - так оставить эту очередь с мьютексом smile
если же наоборот, критична - то три способа(от худшего к лучшему):
1. общая lock-free очередь.
2. на каждый поток по lock-free очереди.
3. новый паттерн disruptor. недавно обсуждали с drug007. посмотри его темы.

Добавлено через 2 минуты и 32 секунды
Цитата(bsa @  16.1.2012,  12:55 Найти цитируемый пост)
gpepsi, lock-free программирование структуры данных 

это да. но читать нужно начинать с самой ранней темы, и до последней. и желательно дважды.
PM WWW   Вверх
gpepsi
Дата 20.1.2012, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



попробовал набросать
Код

template <class T>
class BoundedQueue {
    Q_DISABLE_COPY(BoundedQueue)

public:
    explicit BoundedQueue(uint size) : m_size(size) {}
    ~BoundedQueue() {}

    bool push(const T& item)
    {
        QWriteLocker locker(&m_lock);
        if (m_queue.size() < m_size)
        {
            m_queue.enqueue(item);
            m_condition.wakeAll();
            return true;
        }
        DebugMessage(__FUNCTION__, "BoundedQueue overflow");
        return false;
    }
    bool pop(T& value, uint msecs)
    {
        QReadLocker locker(&m_lock);
        if (m_condition.wait(&m_lock, msecs))
        {
            Q_ASSERT(!m_queue.isEmpty());
            value = m_queue.dequeue();
            return true;
        }
        return false;
    }

private:
    uint            m_size;
    QQueue<T>        m_queue;
    QReadWriteLock    m_lock;
    QWaitCondition    m_condition;
};


но что-то очередь медленная. Я читаю с нее очень медленно.
Может я сто-то с синхронизацией намутил ?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.