[英]Is Clojure's core.async similar to Jane Street's OCaml Core Async?
[英]Mutable data with ocaml and jane street async
我正在OCaml中使用Jane Street的Async庫進行並發的項目。 我希望有多個TCP服務器接受輸入,其處理程序操縱一個哈希表( Hashtbl.t
)。 似乎這種情況需要我使用互斥鎖( Mutex.t
)保護我的哈希表。
但是,當我閱讀Async文檔和Real World Ocaml中的 Async章節時,我得到的印象是有一個使用Deferred.t
和Pipe.t
的“異步世界”,以及一個“系統線程世界”使用Threads和Mutexes,混合它們的唯一方法是使用Thread_safe
模塊,所以我不太習慣只是將互斥量投入我的異步計算。
基本上,在異步中進行並發計算時,如何保護共享的可變數據結構呢?
一般情況下,如果可以原子方式執行,則無需使用互斥鎖進行某些操作。 但是這個陳述根據具體情況有不同的含義。
在異步的上下文中,最嚴格的原子操作定義是這樣的操作,它沒有類型'a Deferred.t
。 換句話說,如果它不是延遲的,那么它是原子的,並且在它的執行過程中它不能被任何其他線程中斷。 實際上,由於async
庫實現了協作線程,因此您總是知道給定函數是否可以被中斷,與先占線程不同。
這意味着,您可以使用任何OCaml模塊,當然包括哈希表,而不使用任何互斥鎖,因為它們的所有操作都是原子的。
合作多線程很少需要互斥鎖。 通常,實現事務行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.