マルチスレッドなFFIの実装
マルチスレッドでOCamlからCを呼ぶ場合、または CからOCamlにコールバックする場合、
は、その部分を
(OCamlを触らないコード) leave_blocking_section(); (OCamlを触るコード) enter_blocking_section(); (OCamlを触らないコード)
のように配置する*1.
2本目のスレッドがOCaml側にやってきたときは、leave_blocking_sectionでコンテキストスイッチまで待たされることになる。
注意: camlspotterさんの記事 等も参考にすること。
実際にFFIでCのコードに入った直後は他のOCamlスレッドがブロックされているので、enter_blocking_section() して、 fopen などブロックする関数を呼び、そのあと leave_blocking_section() することになる。