C 多執行緒系列之多執行緒鎖lock和Monitor

2022-10-08 15:57:13 字數 2696 閱讀 4669

目錄

lock 用於讀乙個引用型別進行加鎖,同一時刻內只有乙個執行緒能夠訪問此物件。lock 是語法糖,是通過 monitor 來實現的。

lock 鎖定的物件,應該是szpcskvml靜態的引用型別(字串除外)。

實際上字串也可以作為鎖的物件使用,只是由於字串物件的特殊性,可能會造成不同位置的不同執行緒衝突。

如果你能保證字串的唯一性,例如 guid 生成的字串,也是可以作為鎖的物件使用的(但不建議)。 

鎖的物件也不一定要靜態才行,也可以通過類例項的成員變數,作為鎖物件。

lock 是 monitor 的語法糖,生成的**對比:

lock (x)

object __lockobj = x;

bool __lockwastaken = false;

tryfinally

這裡先不理會 monitor,後面再說。

首先,如果像下面這樣寫的話,拉出去打 si 吧。

public void mylock()www.cppcns.com

}下面編寫乙個簡單的鎖,示例如下:

class program

:" + sum);

thread.sleep(timespan.fromseconds(1));}}

public static void sum1()}}

public static void sum2()}}

}類將自己設定為鎖, 這可以防止惡意**對公共物件採用做鎖。

例如:public void access()

}鎖可以阻止其它執行緒執行鎖塊(lock(o))中的**,當鎖定時,其它執行緒必須等待鎖中的執行緒執行完成並釋放鎖。但是這可能會給程式帶來效能影響。

鎖不太適合i/o場景,例如檔案i/o,繁雜的計算或者操作比較持久的過程,會給程式帶來很大的效能損失。

10 種優化鎖的效能方法: 

此物件提供同步訪問物件的機制;monotor 是乙個靜態型別,其方法比較少,常用方法如下:

操作說明enter, tryenter獲取物件的鎖。 此操作還標記關鍵節的開頭。 其他任何執行緒都不能輸入臨界區,除非它使用不同的鎖定物件執行臨界區中的說明。wait釋放物件的鎖,以允許其他執行緒鎖定並訪問物件。 呼叫執行緒會等待另乙個執行緒訪問物件。 使用脈衝訊號通知等待執行緒關於物件狀態的更改。pulse 、pulseall將訊號傳送到乙個或多個等待執行緒。 訊號通知等待執行緒:鎖定物件的狀態已更改,鎖的所有者已準備好釋放該鎖。 正在等待的執行緒置於物件的就緒佇列中,因此它可能最終接收物件的鎖。 執行緒鎖定後,它可以檢查物件的新狀態,以檢視是否已達到所需的狀態。exit釋放物件的鎖。 此操作還標記受鎖定物件保護的臨界區的結尾。

下面是乙個很簡單的示例:

private static object obj = new object();

private static bool acquiredlock = false;

public static void test()

catch

finally

}monitor.enter鎖定 obj 這個物件,並且設定 acquiredlock 為 true,告訴別人 obj 已經被鎖定。

最後結束時,判斷 acquiredlock ,釋放鎖,並設定 acquiredlock 為 false。

臨界區:指被某些符號包圍的範圍。例如{}內。

monitor 物件的 enter 和 exit 方法來標記臨界區的開頭和結尾。

enter()方法獲取鎖後,能夠保證只有單個執行緒能夠使用臨界區中的**。使用 monitor 類,最好搭配trycatchfinally來使用,因為如果獲取到鎖但是沒有釋放鎖的話,會導致其它執行緒無限阻塞,即發生死鎖。

一般來說,lock 關鍵字夠用了。

下面示範了多個執行緒如何使用 monitor 來實現鎖:

private static object obj = new object();

private static bool acquiredlock = false;

static void main(string args)

public static void test1()

}catch

finally

}public static void test2()

}catch

finally

}www.cppcns.com如果物件已經被鎖定,另乙個執行緒使用monitor.enter物件,就會一直等待另乙個執行緒解除鎖定。

但是,如果乙個執行緒發生問題或者出現死鎖的情況,鎖一直被鎖定呢?或者執行緒具有時效性,超過一段時間不執行,已經沒有了意義呢?

我們可以通過monitor.tryenter()來設定等待時間,超過一段時間後,如果鎖還沒有釋放,就會返回 false。

改造上面的示例如下:

private static object obj = new object();

private static bool acquiredlock = false;

static void main(string args)

public static void test1()

}catch

finally

}public static void test2()

try}

catch

finally

}本文標題: c#多執行緒系列之多執行緒鎖lock和monitor

本文位址:

python 多執行緒 鎖Lock

在上次講gil鎖的時候 位址 有講到gil鎖也會有釋放的時候,就會導致資料的錯誤讀訪問,10萬次左右可能不會有影響,然而量級大上去,結果就不再是零了。那麼如何解決這種問題呢?這裡引入lock from threading import lock a 0 lock lock def add fun g...

多執行緒系列九 lock

public inte ce lock即在不同方法中呼叫lock,獲得的都是物件鎖。public class conditiontest catch interruptedexception e finally system.out.println after await public void s...

C 多執行緒Lock

一.為什麼要lock,lock了什麼?當我們使用 執行緒的時候,效率最高的方式當然是 非同步,即各個執行緒同時執行,其間不相互依賴和等待。但當不同的執行緒都需要訪問某個資源的時候,就需要 同步機制 了,也就是說當對同乙個資源進行讀寫的時候,我們要使該資源在同一時刻只能被乙個執行緒操作,以確保每個操作...