簡體   English   中英

ocaml和jane street異步的可變數據

[英]Mutable data with ocaml and jane street async

我正在OCaml中使用Jane Street的Async庫進行並發的項目。 我希望有多個TCP服務器接受輸入,其處理程序操縱一個哈希表( Hashtbl.t )。 似乎這種情況需要我使用互斥鎖( Mutex.t )保護我的哈希表。

但是,當我閱讀Async文檔和Real World Ocaml中的 Async章節時我得到的印象是有一個使用Deferred.tPipe.t的“異步世界”,以及一個“系統線程世界”使用Threads和Mutexes,混合它們的唯一方法是使用Thread_safe模塊,所以我不太習慣只是將互斥量投入我的異步計算。

基本上,在異步中進行並發計算時,如何保護共享的可變數據結構呢?

一般情況下,如果可以原子方式執行,則無需使用互斥鎖進行某些操作。 但是這個陳述根據具體情況有不同的含義。

在異步的上下文中,最嚴格的原子操作定義是這樣的操作,它沒有類型'a Deferred.t 換句話說,如果它不是延遲的,那么它是原子的,並且在它的執行過程中它不能被任何其他線程中斷。 實際上,由於async庫實現了協作線程,因此您總是知道給定函數是否可以被中斷,與先占線程不同。

這意味着,您可以使用任何OCaml模塊,當然包括哈希表,而不使用任何互斥鎖,因為它們的所有操作都是原子的。

合作多線程很少需要互斥鎖。 通常,實現事務行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM