【发布时间】:2020-08-08 06:38:49
【问题描述】:
我需要为一个实现锁定以避免竞争条件的小 F# 项目创建两个线程。 (我已经扫描了 StackOverflow 的答案无济于事,因此这篇文章)
代码如下:
let bookFood _ =
Console.WriteLine("Enter amount of grocery bags: ")
let groceryBags = int(Console.ReadLine())
Console.WriteLine("Enter customer name: ")
let name = string(Console.ReadLine().ToString())
let book bags name orders =
lock(bags,name) (fun()-> orders |> List.map (fun order ->
if order.bags = bags then { order with customer = name }
else order ))
orders <- book groceryBags name orders
ThreadPool.QueueUserWorkItem(WaitCallback(bookFood)) |> ignore
ThreadPool.QueueUserWorkItem(WaitCallback(bookFood)) |> ignore
Thread.Sleep(5000)
当我运行此代码时会发生以下问题:
系统提示我输入购物袋的数量两次(应该是这样吗?因为我调用了 bookFood 函数两次,对吧?)
然后我被提示输入客户名称,一旦我输入这个应用程序崩溃并出现以下错误: System.FormatException has been throwed, the input string is not the correct format.
我到处寻找解决方案,但我现在正在寻求帮助。
澄清:
我该如何解决这个问题?是因为我错误地编码了锁定还是我没有正确创建两个线程?当我只调用一次 bookFood 方法时,它工作得很好,但是该任务需要我创建两个线程并使用锁定来避免竞争条件,这就是我得到这个错误的时候。
非常感谢这里活跃的 F# 社区提供帮助,您知道自己是谁。
【问题讨论】:
标签: multithreading functional-programming f# locking f#-interactive