比方說,我在系統的整數列表:F#同步訪問列表
let mutable data: int list = [1; 2; 3; 4; 5]
內被更新(通過添加元素)的相對少生產者和很多消費者的消耗。
注意:如果消費者收到稍微過時的數據,這沒關係。
什麼是正確的方式來同步訪問這個變量?
一個)安全的方法是把這個包變量到代理,並通過序列化的消息訪問它,我們甚至不需要在這裏mutable
修改。但是這種方法似乎是次優的,因爲它會不必要地使所有讀取訪問同步。
乙)AFAIK參考分配是.NET中的原子,所以一個出版商和所有的消費者之間的一個簡單的任務就足夠了:
出版商:data <- newItem :: data
消費者:data |> process
所以才發佈商之間的簡單鎖定足以結束此工作流程?
let monitor = object()
出版商:lock monitor (fun() -> data <- newItem::data)
我說得對不對我的假設?哪種方法更受歡迎,而且對F#更具慣用性?有更好的選擇嗎?
另一個想法是退一步,想傳遞,而不是共享存儲器的消息方面,因而避免了對鎖的需要。例如。:http://blogs.msdn.com/b/dsyme/archive/2010/02/15/async-and-parallel-design-patterns-in-f-part-3-agents.aspx – Mau
這是選項'A'在這個問題中列出,這個用例似乎並不是非常有效。 – Grozz