C#線程同步詳細分析
在向大家詳細介紹C#線程同步之前,首先讓大家了解下C#線程的中止,然后全面介紹C#線程同步。
C#線程的中止
由于能夠在沒有任何征兆的情況下使運行的程序進入一種混亂的狀態,Java中的Thread.stop受到了普遍的反對。根據所調用的stop()方法,一個未經檢查的java.lang.ThreadDeath錯誤將會破壞正在運行著的程序的棧,隨著它的不斷運行,能夠解除任何被鎖定的對象。由于這些鎖被不分青紅皂白地被打開,由它們所保護的數據就非常可能陷入混亂狀態中。
根據當前的Java文檔,推薦的中止一個線程的方法是讓運行的線程檢查一個由其他的線程能夠改變的變量,該變量代表一個“死亡時間”條件。下面的程序就演示了這種方法。
- // 條件變量
- private boolean timeToDie = false;
- // 在每次迭代中對條件變量進行檢查。
- class StoppableRunnable
- extends Runnable {
- public void run() {
- while( !timeToDie ) {
- // 進行相應的操作
- }
- }
- }
上述的討論對C#中的Abort方法也適合。根據調用的Abort方法,令人捉摸不定的System.Threading.ThreadAbortException可能會破壞線程的棧,它可能釋放線程保持的一些變量,使處于保護狀態中的數據結構出現不可預測的錯誤。我建議使用與上面所示的相似的方法來通知一個應該死亡的線程。
C#線程同步
從概念上來看,線程非常易于理解,實際上,由于他們可能交互地對同一數據結構進行操作,因此它們成為了令編程人員頭疼的一種東西。以本文開始的 ThreadingExample為例,當它運行時,會在控制臺上輸出多種不同的結果。從 1 2 3 4 5 1 2 3 4 5到 1 1 2 2 3 3 4 4 5 5或 1 2 1 2 3 3 4 5 4 5在內的各種情況都是可能出現的,輸出結果可能與操作系統的線程調度方式之間的差別有關。有時,需要確保只有一個線程能夠訪問一個給定的數據結構,以保證數據結構的穩定,這也是我們需要C#線程同步機制的原因所在。
為了保證數據結構的穩定,我們必須通過使用“鎖”來調整二個線程的操作順序。二種語言都通過對引用的對象申請一個“鎖”,一旦一段程序獲得該“鎖”的控制權后,就可以保證只有它獲得了這個“鎖”,能夠對該對象進行操作。同樣,利用這種鎖,一個線程可以一直處于等待狀態,直到有能夠喚醒它信號通過變量傳來為止。
C#線程同步例子:
- public static Object synchronizeVariable = "locking variable";
- public static void count() {
- synchronized( synchronizeVariable ) {
- for( int count=1;count<=5;count++ ) {
- System.out.print( count + " " );
- synchronizeVariable.notifyAll();
- if( count < 5 )
- try {
- synchronizeVariable.wait();
- }
- catch( InterruptedException error ) {
- }
- }
- }
- }
【編輯推薦】