ocaml和jane street异步的可变数据

时间:2015-01-05 17:06:05

标签: ocaml

我正在OCaml中使用Jane Street的Async库进行并发的项目。我希望有多个TCP服务器接受输入,其处理程序操纵一个哈希表(Hashtbl.t)。看起来这种情况需要我使用互斥锁(Mutex.t)来保护我的哈希表。

但是,当我阅读Async文档和 Real World Ocaml中的Async章节时,我得到的印象是存在使用Deferred.t和{{as}的“异步世界” {1}}和一个使用Threads和Mutexes的“系统线程世界”,混合它们的唯一方法是使用Pipe.t模块,所以我真的很不舒服只是将互斥量扔进我的异步计算。

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

1 个答案:

答案 0 :(得分:3)

一般情况下,如果可以原子方式执行,则无需使用互斥锁进行某些操作。但是这个陈述根据具体情况有不同的含义。

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

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

合作多线程很少需要互斥锁。通常,实现事务行为。