Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Читатели-писатели, сокрытие реализации на С++

602
10 октября 2009 года
KPI Student
265 / / 16.12.2006
Имеется следующая задача: два писателя, один читатель. Каждая "инстанция" находится в отдельном процессе, общение между ними выполняется с помошью общего сегмента памяти, -- все описанное выше не подлежит обсуждению, так как является условием на лабу :)

Хочу поиграться для себя сделать по-человечески, у меня пока есть два варианта, как красивее обернуть тонкости реализации взаимодейсвия и куча времени думать:

1. // ----------------
Код:
template <class T>
class CSharedContainer
{
public:
    void push(const T& data);
    T    pop();

    bool isWritersExist();
};

int main()
{
    ...
    CSharedContainer<int> data;

    while ( data.isWritersExist() )
        processItem( data.pop() );

    return 0;
}

void writer()
{
    ...
    CSharedContainer<int> data;

    while ( !isTerminateRequested() )
        data.push( getSomething() );

}


2. // ---------------
Код:
template <class T>
class CSharedContainer
{
public:
    void push(const T& data);
   
    CSharedContainer::iterator begin();
    CSharedContainer::iterator end  ();   // сравнение с end() истинно только в случае, если все писатели завершены
};

int main()
{
    ...
    CSharedContainer<int> data;

    std::for_each( data.begin(), data.end(), processItem );

    return 0;
}


void writer()
{
    ...
    CSharedContainer<int> data;
    CDataFactory<int>     getter;

    std::for_each( getter.begin(), getter.end(), CPutterTo(data) );    // можно короче, используя boost::bind или boost::foreach, но нехо тянуть с лабой буст или потрошить последнего на хидеры
}



Вопрос в том, кто как считает - какой из вариантов идеален по соотношению "простота/качество"?

Любые другие варианты приветствуются к обсуждению =)
288
10 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Вопрос по функции bool isWritersExist();. Как определяется отсутствие "писателей"? По тому признаку, что в очереди нет данных?
602
10 октября 2009 года
KPI Student
265 / / 16.12.2006
Нет, конечно. Может я иногда и дурак, но не настолько ;)

Читатель сам создает писателей, соответственно, знает их пид-ы.

Думаю, во втором варианте оптимальным будет создавать (или "присоединять") писателей соответствующим методом контейнера.

Есть пид-ы - можно определить, все ли завершены.
288
10 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: KPI Student
Нет, конечно. Может я иногда и дурак, но не настолько ;)



Да нет. Это я похоже сегодня туплю :)
А как релизовано

 
Код:
CSharedContainer::iterator begin();
    CSharedContainer::iterator end  ();   // сравнение с end() истинно только в случае, если все писатели завершены
?
602
11 октября 2009 года
KPI Student
265 / / 16.12.2006
Как придумаю, так и *будет* реализовано. Пока не решу, какой вариант лучше, думаю над высокоуровневой реализацией этого добра. begin - начало, а там, в операторе iterator::operator++ всегда можно сделать ожидание до прихода следующей порции.
3
11 октября 2009 года
Green
4.8K / / 20.01.2000
IMHO реализовывать поток (а ведь по сути это поток данных) через итерируемый объект как-то неправильно.
Закладывать изначально, что читатель знает писателей,- тоже неправильно.
По сути, ты реализовываешь pipe (pipe тоже реализован с помощью Shared Memory). Может, и делать похожим на pipe?
Т.е. завести операции для работы с потоком данных (put/get, >>/<<) и реализовать их синхронизацию, т.е. чтоб помещение/изъятие из потока не перекрывалось.
288
11 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: KPI Student
Как придумаю, так и *будет* реализовано. Пока не решу, какой вариант лучше, думаю над высокоуровневой реализацией этого добра. begin - начало, а там, в операторе iterator::operator++ всегда можно сделать ожидание до прихода следующей порции.



Собственно меня и смутило использование итераторов в данной ситуации.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог