Реализация MVar на C?

Есть ли какая-нибудь известная реализация Haskell MVar на C? Существует пример того, как реализовать это на C ++. Но я хотел бы реализовать это на C - скажем, пока только MVar CInt эквивалент в C. Написание примитивов синхронизации может быть непростым делом. Так что я хотел бы избежать дублирования усилий, если кто-то уже это сделал. Я недостаточно хорошо разбирался в приведенном выше примере C ++, чтобы уверенно перевести его на C - он очень хорошо скрывает алгоритмические детали от моего C ++ - неопытного ума :)

Причина, по которой я думаю о написании MVar на C, заключается в том, что он делает мне очень легко использовать привязку FFI к внешней библиотеке C для получения потока данных и использовать потоки Haskell для захвата данных (из хранимых векторов, чтобы избежать маршалинга данных - MVar CInt здесь хранит, сколько из хранимых векторов были заполнены). Мне нужно убедиться, что потоки C, записывающие в места хранения, заблокированы, пока поток Haskell читает данные. Вот где помогает синхронизация MVar на стороне C. Также намного быстрее вызвать небезопасную или даже безопасную функцию C из Haskell (~ 15 нс для небезопасных, ~ 150 нс для безопасных в моем тесте), чем обратный вызов в Haskell из C (~ 5 мкс). Если бы обратные вызовы были быстрыми, у меня вместо этого был бы вызов функции C обратно в Haskell и блокировка на Haskell MVar.

Обновление:

Алгоритм в псевдокоде тоже подойдет. Это должно быть довольно легко реализовать на C, учитывая алгоритм для newEmptyMVar, takeMVar и putMVar.

11
задан Sal 18 January 2012 в 16:16
поделиться