在 Julia 使用多執行緒跑平行運算 - threads 及 lock 的使用
基本上在 Julia 上跑多執行緒不太困難,在環境中先設定好執行緒的數量,或是在執行 Julia 時增加執行緒數目。
1 | julia --threads 4 |
如果既有的程式碼是 for 迴圈,基本上不難改。
1 | Threads.@threads for i = 1:1000_000 |
但是終究會遇到要存取同一個物件的時候,這個時候就會有 race condition。
要避免 race condition 的方式就是使用 lock。
1 | results = [] |
在迴圈中計算 do_something,我們想要把計算結果儲存下來,我們將他儲存在 results 中。
這時候我們必須用一個 lock 來把要存取的資源鎖住,一開始會產生一個 SpinLock,當程式執行到 lock(splock) 的時候,如果這個 lock 可以被取用,那這個執行緒就會拿這個 lock 並且進到後續的程式區塊中。如果前面有人拿了 lock,那目前這個想拿 lock 的執行緒就得等到 lock 被釋放才可以。
當程式執行完,unlock(splock) 會將 lock 給釋放掉,這個時候其他的執行緒就可以拿這個 lock 進到程式區塊中。
如此可以保證每次操作 results 物件的只能有一個執行緒,可以避免 race condition。