Я нахожусь в процессе создания библиотеки C для некоторой кодировки в интерфейсе каналов, но я натолкнулся на некоторые дизайнерские решения, которые необходимо принять.
После того, как библиотека C настроена, мы сохраняем контекст кодировщика. При этом мы можем либо закодировать, либо изменить некоторые параметры (давайте вызовем интерфейс Haskell для этой последней функции tune :: Context -> Int -> IO ()
). В моем вопросе две части:
- Часть кодирования легко завернуть в
Pipe Foo Bar IO ()
, но я также хотел бы раскрытьtune
. Поскольку одновременное использование контекста кодирования должно быть защищено блокировкой, мне нужно будет блокировать каждую итерацию в канале и защищатьtune
, взяв ту же блокировку. Но теперь я чувствую, что навязываю пользователю скрытые блокировки. Я лаю не на то дерево? Как обычно разрешается подобная ситуация в экосистеме труб? В моем случае я ожидаю, что канал, частью которого является мой конкретный код, всегда будет выполняться в своем собственном потоке с одновременной настройкой, но я не хочу навязывать эту точку зрения каким-либо пользователям. Другие пакеты в экосистеме каналов, похоже, тоже не принуждают своих пользователей. - Контекст кодирования, который больше не используется, необходимо правильно деинициализировать. Как в экосистеме труб гарантировать, что такие вещи (в данном случае выполнение некоторых
IO
действий) будут выполнены, когда труба будет уничтожена?
Конкретным примером может быть упаковка библиотеки сжатия, и в этом случае вышеприведенное может быть:
- Сила сжатия регулируется. Ставим трубу, и она весело бежит. Как лучше всего разрешить изменение параметра силы сжатия, пока канал продолжает работать, предполагая, что параллельный доступ к контексту кодека сжатия должен быть сериализован?
- Библиотека сжатия выделила кучу памяти из кучи Haskell при настройке, и нам нужно будет вызвать какую-то библиотечную функцию, чтобы очистить это, когда канал будет разорван.
Спасибо… это может быть все очевидно, но я новичок в экосистеме трубок.
Редактировать: Читая это после публикации, я совершенно уверен, что это самый расплывчатый вопрос, который я когда-либо задавал здесь. Фу! Извини ;-)
pipes-concurrency
? В нем есть учебный модуль Которые могут оказаться полезными. Я дам этот ответ поближе сегодня вечером. - person Gabriel Gonzalez   schedule 03.09.2014