c 中Lock(鎖)的研究以及跨執行緒UI的操作

2022-09-16 22:39:23 字數 1985 閱讀 5123

本文只針對c#中,多執行緒同步所用到的鎖(lock)作為研究物件。由於想更直觀的顯示結果,所以,在做demo的時候,就把多執行緒通過事件操作ui的**也寫了出來,留作備忘和分享吧。

其實多執行緒的同步,使用同步鎖的方法用了好多次,今天無意中看到msdn中,建議用:

1 private static readonly object locker1 = new object();

2 private readonly object locker2 = new object();

備註:原文並沒有加readonly,是我後來自己加進去的。

我不僅思考了一下他們的區別。

然後我寫了一段**進行測試,測試類**如下:

複製**

///

/// 跨執行緒操作ui的時候傳遞的引數,本文為了顯示訊息,所以簡單的封裝了乙個

///

public class myeventargs : eventargs

}///

/// 測試類,用於測試2種鎖的區別

///

public class locktest

//要鎖的變數,通過它可以看出2種鎖在不同情況下的效果

private int num = 0;

//例項名字

private readonly string name;

public locktest(string name)

//第一種鎖執行的方法

public void addnum1()

}//第二種鎖執行的方法

public void addnum2()

}//鎖內的一些操作,並通過事件,把關鍵的訊息顯示到主線程中的ui裡

private void showmessage()

],例項中num的值是", thread.currentthread.name, this.name, num);

onmessage(new myeventargs(msg));

thread.sleep(100);

}msg = string.format("*****=執行緒 執行完畢*****=", thread.currentthread.name);

onmessage(new myeventargs(msg));}}

複製**

測試用的類寫完了,開始測試:

首先測試單個例項、多執行緒,2種鎖的區別:

private void button1_click(object sender, eventargs e)

}private void button2_click(object sender, eventargs e)

}輸出結果一模一樣:

得出結論:如果對乙個例項,多執行緒訪問的時候,2種鎖是沒有區別的。

下面是測試多個例項的情況(靜態鎖):

複製**

private void button3_click(object sender, eventargs e)

}複製**

得到結果:

得出結論,在靜態鎖面前,執行緒依舊要排隊,雖然不是乙個例項,但是鎖是唯一的,執行緒只認鎖,所以執行緒並沒有併發!

繼續測試(非靜態的鎖):

複製**

private void button4_click(object sender, eventargs e)

}複製**

得到的結果:

得出結論:非靜態鎖的時候,多執行緒併發了,一起在工作。

其實,測試的結果之前也能猜想出來,只不過,不測試下,心裡總是覺得沒底,呵呵,測試完了,也就徹底釋然了!

窗體中,用於事件**,顯示到ui裡的**在這裡:

複製**

delegate void messagehandler(string msg);

public void messagecallback(object sender, myeventargs e));}

public void showmessage(string msg)

python執行緒中的執行緒鎖Lock物件

原語鎖定 或互斥鎖定 是乙個同步原語,狀態是 已鎖定 或者 未鎖定 之一。兩個方法 acquire 和 release 用於修改鎖定的狀態。如果狀態已鎖定,嘗試獲取鎖定將被阻塞,直到鎖定被釋放為止。如果有多個執行緒等待獲取鎖定,當鎖定釋放時,只有乙個執行緒能獲得它。等待執行緒獲得鎖定的順序沒有定義。...

C 執行緒Lock鎖 只能鎖定物件

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

C 關於多執行緒及執行緒同步 lock鎖的應用

form1.cs using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using syst...