управление несколькими буферами в C - PullRequest
1 голос
/ 18 февраля 2012

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

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

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

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

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

{
    stream_id
    buff_ptr
}

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

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


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

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

Спасибо.

P.S .: Извините за рейв! ~

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

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

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

    • Можете ли вы сделать так, чтобы вызывающий передавал вам указатель на буфер?
    • Можете ли вы использовать хеш вместо списка и искать по stream_id?Например, glib2 предоставляет такой хеш

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

0 голосов
/ 18 февраля 2012

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

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

...