我正在OCaml中使用Jane Street的异步库进行并发性项目。我希望有多个TCP服务器接收输入,其处理程序操作单个哈希表( Hashtbl.t)。这个场景似乎需要我用互斥(Mutex.t)来保护我的哈希表。
然而,当我阅读异步文档和really Ocaml中有关异步的章节时,我得到的印象是,有一个使用Deferred.t和Pipe.t的“异步世界”,以及一个使用线程和Mutexes的“系统线程世界”,而唯一的混合方法是使用Thread_safe模块,所以我不太愿意把互斥放入异步计算中。
因此,基本上,在异步中进行并发计算时,我应该如何保护共享的可变数据结构?
发布于 2015-01-05 17:20:49
通常,如果可以以原子方式执行,则不需要使用互斥锁来保护某些操作。但这句话根据上下文的不同有不同的含义。
在异步上下文中,原子操作最严格的定义是不具有'a Deferred.t类型的操作。换句话说,如果它没有被延迟,那么它是原子的,在它的执行过程中,它不能被任何其他线程中断。实际上,由于async库实现了协作线程,所以您始终知道给定函数是否可以被中断,这与抢占线程不同。
这意味着您可以使用任何OCaml模块,当然包括哈希表,而不需要任何互斥,因为它们的所有操作都是原子的。
在合作多线程处理中,Mutexes很少被需要。通常,要实现事务行为。
https://stackoverflow.com/questions/27784389
复制相似问题