使用 ocaml 和 jane street async 的可变数据

Mutable data with ocaml and jane street async

我正在 OCaml 中使用 Jane Street 的异步库进行并发处理一个项目。我想让多个 TCP 服务器接受输入,它们的处理程序操纵单个哈希表(Hashtbl.t)。似乎这种情况需要我使用互斥锁(Mutex.t)来保护我的哈希表。

但是,当我阅读 Real World Ocaml 中的异步文档和有关异步的章节时, 我的印象是 "async world" 使用 Deferred.t's 和 Pipe.t's,以及一个使用线程和互斥锁的 "system thread world",混合它们的唯一方法是使用 Thread_safe 模块,所以我不是真的只需将互斥体放入我的异步计算中就很舒服。

所以基本上,在异步进行并发计算时,我应该如何保护共享的可变数据结构?

一般来说,如果某些操作可以自动执行,则不需要使用互斥锁来保护它。但这句话根据上下文有不同的含义。

在异步上下文中,原子操作最严格的定义是没有类型的操作'a Deferred.t。换句话说,如果它没有被延迟,那么它就是原子的,在它执行的过程中,它不能被任何其他线程打断。事实上,由于 async 库实现了协作线程,你总是知道给定的函数是否可以被中断,这与抢占式线程不同。

这意味着,您可以使用任何 OCaml 模块,当然包括哈希表,无需任何互斥锁,因为它们的所有操作都是原子的。

协作式多线程实际上很少需要互斥锁。通常,实现交易行为。