我正在OCaml中使用Jane Street的Async库进行并发的项目。我希望有多个TCP服务器接受输入,其处理程序操纵一个哈希表(Hashtbl.t
)。看起来这种情况需要我使用互斥锁(Mutex.t
)来保护我的哈希表。
但是,当我阅读Async文档和 Real World Ocaml中的Async章节时,我得到的印象是存在使用Deferred.t
和{{as}的“异步世界” {1}}和一个使用Threads和Mutexes的“系统线程世界”,混合它们的唯一方法是使用Pipe.t
模块,所以我真的很不舒服只是将互斥量扔进我的异步计算。
基本上,在异步执行并发计算时,我应该如何保护共享的可变数据结构?
答案 0 :(得分:3)
一般情况下,如果可以原子方式执行,则无需使用互斥锁进行某些操作。但是这个陈述根据具体情况有不同的含义。
在异步的上下文中,最严格的原子操作定义是没有类型'a Deferred.t
的操作。换句话说,如果它不是延迟的,那么它是原子的,并且在它的执行过程中它不会被任何其他线程中断。实际上,由于async
库实现了协作线程,因此您总是知道给定的函数是否可以被中断,与先占线程不同。
这意味着,您可以使用任何OCaml模块,当然包括哈希表,而不使用任何互斥锁,因为它们的所有操作都是原子的。
合作多线程很少需要互斥锁。通常,实现事务行为。