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() );
}
Читатели-писатели, сокрытие реализации на С++
Хочу поиграться для себя сделать по-человечески, у меня пока есть два варианта, как красивее обернуть тонкости реализации взаимодейсвия и куча времени думать:
1. // ----------------
Код:
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, но нехо тянуть с лабой буст или потрошить последнего на хидеры
}
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, но нехо тянуть с лабой буст или потрошить последнего на хидеры
}
Вопрос в том, кто как считает - какой из вариантов идеален по соотношению "простота/качество"?
Любые другие варианты приветствуются к обсуждению =)
Вопрос по функции bool isWritersExist();. Как определяется отсутствие "писателей"? По тому признаку, что в очереди нет данных?
Читатель сам создает писателей, соответственно, знает их пид-ы.
Думаю, во втором варианте оптимальным будет создавать (или "присоединять") писателей соответствующим методом контейнера.
Есть пид-ы - можно определить, все ли завершены.
Цитата: KPI Student
Нет, конечно. Может я иногда и дурак, но не настолько ;)
Да нет. Это я похоже сегодня туплю :)
А как релизовано
Код:
CSharedContainer::iterator begin();
CSharedContainer::iterator end (); // сравнение с end() истинно только в случае, если все писатели завершены
CSharedContainer::iterator end (); // сравнение с end() истинно только в случае, если все писатели завершены
Как придумаю, так и *будет* реализовано. Пока не решу, какой вариант лучше, думаю над высокоуровневой реализацией этого добра. begin - начало, а там, в операторе iterator::operator++ всегда можно сделать ожидание до прихода следующей порции.
Закладывать изначально, что читатель знает писателей,- тоже неправильно.
По сути, ты реализовываешь pipe (pipe тоже реализован с помощью Shared Memory). Может, и делать похожим на pipe?
Т.е. завести операции для работы с потоком данных (put/get, >>/<<) и реализовать их синхронизацию, т.е. чтоб помещение/изъятие из потока не перекрывалось.
Цитата: KPI Student
Как придумаю, так и *будет* реализовано. Пока не решу, какой вариант лучше, думаю над высокоуровневой реализацией этого добра. begin - начало, а там, в операторе iterator::operator++ всегда можно сделать ожидание до прихода следующей порции.
Собственно меня и смутило использование итераторов в данной ситуации.