управление несколькими буферами в C

Что вы порекомендуете сделать для буферизации нескольких потоков (для каждого потока потребуется собственный буфер) в C?

Я вроде собрал в голове решение:

Это теоретический «псевдокод»

[ptr, ptr, ptr, ptr ... ]

Каждый ptr является указателем на структуру:

{
    stream_id
    buff_ptr
}

stream_id - это идентификатор потока (у меня есть эта информация), а buff_ptr - это указатель на некоторые malloced данные. Кроме того, буферы, вероятно, должны быть гибкими, и им придется часто вызывать malloc и free, чтобы сделать их гибкими (по крайней мере, я думаю, что это так?

Я бы в основном нашел нужный буфер, перебирая массив ptrs.


Итак, эта «архитектура» хороша или есть лучшая?

Если кто-то задается вопросом: "Зачем это няню?" Я сделал сервер на Ruby / EventMachine, протокол действительно прогнил (мягко говоря), и я не знаю, как еще с ним справиться ... Если нет способа заставить EventMachine буферизовать его для меня, это я полагаю, это было бы лучшим решением.

Спасибо.

P.S: Простите за рейв! ~


person omninonsense    schedule 17.02.2012    source источник
comment
Если stream_id было целым числом от 0 до N, вы могли бы использовать массив buff_ptr и не искать в списке struct, чтобы найти требуемый поток.   -  person hmjd    schedule 18.02.2012
comment
@hmjd А, это не так. Я тоже сначала думала, что это было. Иногда это так, а иногда нет. На самом деле, это все немного случайно. И это почти никогда не начинается с 0 - теперь, когда я думаю об этом.   -  person omninonsense    schedule 18.02.2012
comment
Есть ли предопределенный диапазон даже для stream_id? Если бы он был, вы могли бы использовать разреженный массив.   -  person hmjd    schedule 18.02.2012
comment
@hmjd Нет. Насколько я понял, он обычно начинается с некоторого случайного целого числа, затем увеличивается, но он не увеличивается все время, иногда он случайным образом переходит к случайному числу, затем снова начинает увеличиваться и так далее.   -  person omninonsense    schedule 18.02.2012


Ответы (2)


Что ж, это кажется единственным вариантом, но вы можете изменить несколько вещей:

  • Не malloc и free. Вместо этого используйте realloc
  • Итерировать по списку можно, но если буферов много

Многие API (например, epoll) позволяют связывать указатель с идентификатором (дескриптор в случае epoll). Когда с этим идентификатором происходит что-то интересное, API передает вам указатель -> поиск нуля за счет 4-8 байтов памяти.

person cnicutar    schedule 18.02.2012
comment
Есть ли в C такая вещь, как хеш? Я не знал, что это было! c новичком ~ - person omninonsense; 18.02.2012
comment
@withadot. Стандартного нет. Вы можете реализовать это самостоятельно или использовать уже готовый (например, glib2 хеш). - person cnicutar; 18.02.2012
comment
Ой. Представьте себе это. А простая установка есть? - person omninonsense; 18.02.2012
comment
@withadot. Зависит от вашей платформы. Если вы используете Unix, скорее всего, он у вас уже есть. На самом деле не знаю об окнах. - person cnicutar; 18.02.2012
comment
Я отмечу этот ответ как принятый, потому что glib - это ~ рай ~, но также включу упоминание Glib в ответ. Так что людям не нужно копаться в комментариях. хо - person omninonsense; 18.02.2012

Используйте libev, чтобы создать простой цикл событий и позволить ему обрабатывать дескрипторы файлов опроса. Есть много примеров, и эта страница руководства (man 3 libev) - одна из лучших, что я читал.

Просто определите несколько обратных вызовов и создайте несколько буферов для ваших пулов чтения и записи. Размер этих пулов может оставаться статическим до тех пор, пока вы блокируете или пропускаете операции чтения и записи при заполнении или исчерпании буфера соответственно.

person jmkeyes    schedule 18.02.2012