使用 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 模块,当然包括哈希表,无需任何互斥锁,因为它们的所有操作都是原子的。
协作式多线程实际上很少需要互斥锁。通常,实现交易行为。
我正在 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 模块,当然包括哈希表,无需任何互斥锁,因为它们的所有操作都是原子的。
协作式多线程实际上很少需要互斥锁。通常,实现交易行为。