OOWA: 鎖、訪問控制與輸入輸出

來自專欄作為工具的語言

當我們談論編程裏的並發與並行時,肯定繞不開的兩個概念就是「臨界區域」和「鎖」。但這兩個概念其實沒有你想像的那麼難,很多時候,讓它們變難的,其實是很多編程語言裡面錯誤的思維方式(是的,這些編程語言裏包括了 C、C++ 和 Java),或者說,這兩個概念本身就是不必要的。

為了說明這兩個概念的不必要之處,最好的辦法,就是用正確的方式將這個並發和並行場景下常常語言的問題推演一遍。這裡,我將用 RDS 之間輸入(input)和輸出(output)的方式來演示它。

首先,當一個 RDS 輸出端連接多個 RDS 的輸入端時,這就相當於內容的分發,是一點問題也沒有的,如下圖所示:

一個輸出埠對多個輸入埠

而當一個 RDS 的輸入端連接多個 RDS 的輸出端時,就會引發輸入輸出內容上的衝突,所以多個輸出端實際上是不能直接連接一個輸入端的,這點如下圖所示:

一個輸入埠對多個輸出埠,產生衝突

實際中,RDS 還可以有既當輸入又當輸出的埠,也就是 inout;這種埠因為具有輸入性質,所以和上圖一樣,也是不能直接連接上多個埠的。

那麼,當我們有多個輸出端想接入一個輸入端的需求的時候,我們該怎麼辦呢?答案就是建立一個用於「訪問控制(access control)」的 RDS 去處理這個衝突,這裡如下圖所示:

解決衝突的辦法:訪問控制

看到這裡,有些有操作系統開發經驗的同學可能覺得我只是在說「讀寫鎖」,然而實際上,所有使用「鎖」的編程場景,面對的其實都是這種問題。

而解決這個問題的正確答案,其實就是上圖所說的,建立一個用於訪問控制的 RDS,這種 RDS 可以是一個訪問隊列或者是訪問環,總比用「鎖」和「臨界區域」的方式來描述它要明確得多。

根據 When we share, everyone wins - Creative Commons 網站的協議,本文

署名-非商業性使用-相同方式共享

CC BY-NC-SA

推薦閱讀:

查看原文 >>
相關文章