【发布时间】:2012-02-12 20:55:53
【问题描述】:
在 C 中是否有任何已知的 Haskell MVar 实现?有一个 example 关于如何在 C++ 中实现它。但是,我想在 C 中实现它——让我们现在只说在 C 中等效的 MVar CInt。编写同步原语可能很棘手。所以,如果有人已经做过,我想避免重复工作。我对上面的 C++ 示例理解得不够好,无法自信地将其翻译成 C - 它很好地隐藏了我没有 C++ 经验的算法细节:)
我考虑用 C 编写 MVar 的原因是因为它使我可以很容易地使用 FFI 绑定到外部 C 库来获取数据流,并使用 Haskell 线程来获取数据(来自 Storable向量以避免封送数据 - 此处的 MVar CInt 存储已填充多少可存储向量)。我需要确保在 Haskell 线程读取数据时,写入可存储位置的 C 线程被阻塞。这就是 C 端的 MVar 同步有帮助的地方。从 Haskell 调用不安全甚至安全的 C 函数(在我的测试中为不安全约 15ns,为安全约 150ns)也比从 C 回调到 Haskell(约 5us)要快得多。如果回调速度很快,我会改为将 C 函数调用回 Haskell,并阻止 Haskell MVar。
更新:
伪代码中的算法也可以。考虑到 newEmptyMVar、takeMVar 和 putMVar 的算法,用 C 语言实现它应该很容易。
【问题讨论】:
-
对于那些不熟悉 Haskell 的
MVar,请参阅:Control.Concurrent.MVar -
我无法帮助您解决您的问题,但是您从哪里得到时间在 Haskell 和 C 之间进行外部通话。昨天,我一直在徘徊如何使用标准进行基准测试。
-
@jmg,这里的代码(对于 haskell->C):hpaste.org/56609。那里没有标准基准,但应该很简单,结果应该非常接近。对于 C->Haskell 回调,请参阅这篇文章中的代码:stackoverflow.com/questions/8902568/…
标签: c haskell synchronization ffi