OCaml 的 Thread 模块是不是没有用,类似 Python 的 GIL?

OCaml 代码中使用了 Thread:

let () = print_endline "Hello, World!"

let rec fib_normal (n: int): int =
    match n with
    | 0 | 1 -> n
    | x when x < 0 -> failwith "Negative number!"
    | _ -> fib_normal (n - 1) + fib_normal (n - 2)

let () =
    let _ = print_endline "With multi-threading:" in
    let handle_1 = Thread.create fib_normal 41 in
    let handle_2 = Thread.create fib_normal 41 in
    Thread.join handle_1; Thread.join handle_2;
    let _ = print_endline "Without multi-threading:" in
    let _ = fib_normal 41 in let _ = fib_normal 41 in ()

分别使用多线程运行 2 次 fib 函数、顺序执行两次 fib 函数,前者和后者速度上没有区别,CPU 使用率也一直不超过 100%(如果是多线程的计算密集型程序会高于 100%)。

OCaml (< 5.0.0) 标准库的 Thread 是不是和 CPython 的 threading 模块一样由于 GIL 全局锁的存在而不能并行地执行代码?如果是,那么在 5.0.0 版本以前是如何写并行代码的?

(标签里居然没有 OCaml 的选项,随便填一个 #Haskell)

阅读 1.6k
1 个回答

有锁

假多线

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏