私は同時実行プログラミングに非常に慣れていないので、解決する必要があるデッドロックに関する小さな問題があります。
したがって、以下のこのコードでは、デッドロックが発生したと思われるものは何も出力されませんが、それがどのように発生するかはよくわかりません。
let sleepMaybe() = if (random 4) = 1 then Thread.Sleep 5
type account(name:string) =
let balance = ref 1000
member this.Balance = lock this <| fun () -> !balance
member this.Name = name
member this.Withdraw amount = balance := !balance - (sleepMaybe(); amount)
member this.Deposit amount = balance := !balance + (sleepMaybe(); amount)
member this.Transfer (toAcc:account) amount =
lock this <| fun () -> lock toAcc <| fun () -> toAcc.Deposit amount
this.Withdraw amount
let doTransfers (acc:account) (toAcc:account) () =
for i in 1..100 do acc.Transfer toAcc 100
printfn "%s balance: %d Other balance: %d" acc.Name acc.Balance toAcc.Balance
let q2main() =
let acc1=account("Account1")
let acc2=account("Account2")
startThread (doTransfers acc1 acc2)
startThread (doTransfers acc2 acc1)
q2main()