ETH官方钱包

前往
大廳
主題

LeetCode - 1114. Print in Order 解題心得

Not In My Back Yard | 2021-03-25 00:00:01 | 巴幣 4 | 人氣 383

題目連結(jié):


題目意譯:
假設(shè)我們有一個(gè)類別(Class):
public class Foo {
  public void first() { print("first"); }
  public void second() { print("second"); }
  public void third() { print("third"); }
}

Foo 的同一實(shí)例(Instance)會被傳進(jìn)三個(gè)不同的執(zhí)行緒中。執(zhí)行緒 A 會呼叫 first()、執(zhí)行緒 B 會呼叫 second(),而執(zhí)行緒 C 會呼叫 third()。設(shè)計(jì)一個(gè)機(jī)制並修改程式以確保 second() 執(zhí)行於 first() 後,且 third() 執(zhí)行於 second() 後。

注:
我們並不知道作業(yè)系統(tǒng)中執(zhí)行緒會被怎麼安排時(shí)程,即使輸入中的數(shù)字隱含著順序。你看到的輸入格式主要是用以確保我們測試的可判讀性。



範(fàn)例測資:
範(fàn)例 1:
輸入: [1,2,3]
輸出: "firstsecondthird"
解釋: 會有三個(gè)執(zhí)行緒非同步並行。輸入 [1,2,3] 代表執(zhí)行緒 A 呼叫 first() 、 執(zhí)行緒 B 呼叫 second() 且執(zhí)行緒 C 呼叫 third()。"firstsecondthird" 為正確輸出。

範(fàn)例 2:
輸入: [1,3,2]
輸出: "firstsecondthird"
解釋: 輸入 [1,2,3] 代表執(zhí)行緒 A 呼叫 first() 、 執(zhí)行緒 B 呼叫 third() 且執(zhí)行緒 C 呼叫 second()。"firstsecondthird" 為正確輸出。


解題思維:
本題是 LeetCode 上一種特別的題目類型,稱為並行(Concurrent)。基本上這類題目會牽涉到多執(zhí)行緒、同步非同步、等待的問題。例如本題就是 third 的輸出要等 second 、 second 的輸出要等 first。

而 C++11 時(shí)為 C++ 新增了一種物件稱作互斥鎖(Mutex),可以參見這位大大的介紹文。

所以我們宣告兩個(gè)鎖 m1 、 m2 對應(yīng)到 first 以及 second,然後一開始就把 m1 、 m2 鎖起來(m1.lock() 、 m2.lock())。

接著在 first() 裡,我們在輸出後面加上 m1.unlock() ,用以表示 first 已輸出。

然後對於 second() 裡,我們在輸出先先 m1.lock(),這樣如果 first 還沒輸出則 m1 還沒解鎖,因此會鎖不起來,進(jìn)而停在那邊;在輸出後面加上 m1.unlock() 、 m2.unlock(),原因同 first()。

最後對於 third(),我們則只需要仿照 second():在輸出前 m2.lock()、輸出後 m2.unlock() 即可。

有了上面的機(jī)制,便會讓 third 等 second 、 second 等 first 因此確保輸出必為 firstsecondthird 了。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創(chuàng)作回應(yīng)

追蹤 創(chuàng)作集

作者相關(guān)創(chuàng)作

更多創(chuàng)作