我正在为管道接口中的某些编码包装一个 C 库,但我遇到了一些需要做出的设计决策。
建立 C 库后,我们保留一个编码器上下文。有了这个,我们可以编码,或者改变一些参数(让我们调用 Haskell 接口到最后一个函数tune :: Context -> Int -> IO ()
)。我的问题有两个部分:
- 编码部分很容易包含在 . 中
Pipe Foo Bar IO ()
,但我也想公开tune
. 由于同时使用编码上下文必须受到锁保护,因此我需要在管道中的每次迭代时都使用锁,并tune
使用相同的锁进行保护。但现在我觉得我在强迫用户隐藏锁。我在这里吠错树了吗?这种情况在管道生态系统中通常是如何解决的?就我而言,我希望我的特定代码所属的管道始终在其自己的线程中运行,同时进行调整,但我不想将这种观点强加给任何用户。管道生态系统中的其他软件包似乎也没有强迫他们的用户喜欢。 - 不再使用的编码上下文需要正确地取消初始化。在管道生态系统中,如何确保
IO
在管道被销毁时处理这些事情(在这种情况下执行 som 操作)?
一个具体的例子是包装一个压缩库,在这种情况下,上面可以是:
- 压缩强度是可调的。我们设置了管道,它愉快地运行。假设必须序列化对压缩编解码器上下文的并发访问,最好如何在管道继续运行时更改压缩强度设置?
- 压缩库在设置时从 Haskell 堆中分配了一堆内存,当管道被拆除时,我们需要调用一些库函数来清理这些内存。
谢谢......这可能都很明显,但我对管道生态系统很陌生。
编辑:发布后阅读此内容,我很确定这是我在这里问过的最模糊的问题。啊! 对不起 ;-)