16 5 2 併發訪問郵箱

2021-06-03 07:58:52 字數 1341 閱讀 3005

16.5.2 併發訪問郵箱

郵箱處理器每次(很少)只處理乙個郵件,但它可以安全地從多個執行緒訪問。用於發布訊息給處理器的所有方法(例如,post 和 postandreply)都是執行緒安全的。讓我們建立乙個小應用程式,演示從三個執行緒併發訪問我們的郵箱處理器。

清單 16.20 表示的情況是,有兩個執行緒在重複地執行計算,然後,傳送狀態更新給郵箱處理器。為了使**簡單,我們的執行緒將只休眠一段時間,然後生成乙個隨機數字。第三個執行緒重**送 block 和 resume 訊息給處理器,在兩個訊息之間再次休眠。

listing 16.20 sending messages from multiple threads (f#)

let modifythread() =

let rnd = new random(thread.currentthread.managedthreadid)

while true do

thread.sleep(500)

mbox.post(modifystate(rnd.next(11) - 5))

let blockthread() =

while true do

thread.sleep(2000)

mbox.post(block)

thread.sleep(1500)

mbox.post(resume)

for proc in [ blockthread; modifythread; modifythread ] do

async.start(async )

這些執行緒的**相當簡單。兩個函式都包含無限迴圈,在實際的應用程式中,可以執行有用的工作,兩個偶爾傳送訊息給郵箱進行同步。第乙個函式只使用 modifystate 訊息,第二個函式首先傳送訊息,阻塞郵箱,然後,等待一段時間,取消阻止。我們使用 async.start 來開始執行三個執行緒池執行緒中的函式,通過建立乙個函式值列表,表示執行的程序,然後,在 for 迴圈中啟動每乙個。這個列表包含 modifythread 函式兩次,所以,我們會有兩個執行緒傳送更新的狀態。

讓我們分析應用程式執行時的行為,它列印操作的時間,因此,可以執行它,並看看列印的時間。它首先處理入站的 modifystate 大約 2 秒鐘。阻止/恢復執行緒然後傳送 block 訊息,所以,在接下來的 1.5 秒內,沒有內容列印到控制台,雖然新的 modifystate 訊息仍在傳送到郵箱。之後,郵箱處理器將恢復,並處理所有排隊的 modifystate 訊息,因此,狀態將快速連續地更新幾次。在下乙個 2 秒內,它將繼續執行,處理到達的訊息,直到下乙個 block 訊息接收到。

儘管這個示例沒有實現任何特別有用的行為,但給你乙個很好的概念,如何在實際的應用程式中使用郵箱處理器,需要通過訊息傳遞併發同步狀態。

佇列併發訪問

最近在做乙個專案,涉及到佇列併發訪問的問題,最後通過.net4.0中的concurrent得以解決。使用該引用之前,先安裝.net4.0.應用舉例 using system.collections.concurrent concurrentqueuequeue new concurrentqueue...

如何利用ASP實現郵箱訪問

您在訪問 時是否會在有些頁面上見到這種功能 您在可以訪問此 的同時,還可以檢視您免費郵箱中是否有新郵件。這個功能是不是讓您覺得很心動 很神秘呢?下面,我就用asp來舉個例子讓您知道是如何實現這一功能的。首先你可以去一些提供免費郵件服務的站點,申請乙個賬號然後登入。在開啟郵箱時,請您注意位址列中的內容...

配置Exchange郵箱完全訪問許可權

一 問題與需求闡述 1.在很多企業中,都會有boss希望其秘書能夠以其名義檢視並且傳送郵件 2.此需求可以通過將boss的密碼告知秘書,讓其管理自己的郵箱,但是會存在一定的風險 3.此外還可以通過配置郵箱的完全訪問許可權實現。二 目標 對a使用者的郵箱賦予b使用者具有完全訪問許可權,讓b使用者對a郵...