为什么OCaml有互斥模块?
据我所知,OCaml确实提供了并发性,但并不是并行性 (为什么OCaml的线程被认为是“不够的”?)
那么为什么OCaml仍然提供Mutex
模块并提供lock
?
如果没有两个线程可以同时运行,那么为什么我们仍然需要lock
?
一般而言,代码修改中的关键区域会在线程之间共享数据,导致数据处于不一致的状态。 这与在同时执行过程时完全相同。 正如@nlucaroni所指出的那样,在关键区域中间的上下文切换不应该允许另一个线程进入相同的关键区域。 例如:
(* f should count the number of times it's called *)
let f =
let x = ref 0 in
fun () ->
x := !x + 1;
!x
在查找x
但在商店之前进行上下文切换可能会导致错误计数。 这是用互斥锁修复的。
(* f should count the number of times it's called *)
let f =
let x = ref 5 in
let m = Mutex.create () in
fun () ->
Mutex.lock m;
x := !x + 1;
let ret = !x in
Mutex.unlock m;
ret
将解决这个问题。
因为互斥是一个并发原语,并不是特定于并行。 它用于从其他并发实体的角度来执行一段代码。 它用于在执行特定代码段时组织对数据的特定部分的独占访问(例如,以确保只有单个并发执行线程正在修改数据,以中断处理中的不变量,但在释放互斥之前恢复这些不变量以使其他并发线程的执行将在访问它时看到一致的数据)。
链接地址: http://www.djcxy.com/p/79343.html