c#為多個執行緒的同步提供了自己的關鍵字:lock語句。lock 語句獲取給定物件的互斥 lock,執行語句塊,然後釋放 lock。 持有 lock 時,持有 lock 的執行緒可以再次獲取並釋放 lock。 阻止任何其他執行緒獲取 lock 並等待釋放 lock。
});console.writeline(num);
console.readkey();}}
} }
console.writeline(a);}}
}}lock建立單例:
public class people}}
return _instance;}}
}
提供同步訪問物件的機制。lock 相當於乙個簡易的 monitor。
); console.writeline(num);
console.readkey();}}
}相對於 lock,monitor類還提供了:
tryenter(object obj, timespan timeout)
在指定的時間內嘗試獲取指定物件上的排他鎖。
isentered(object obj)
確定當前執行緒是否保留指定物件上的鎖。
wait(object obj)
釋放物件上的鎖並阻止當前執行緒,直到它重新獲取該鎖。
pulse(object obj)
通知等待佇列中的執行緒鎖定物件狀態的更改,允許乙個等待中的繼續
為多個執行緒共享的變數提供原子操作。
); console.writeline(num);
console.readkey();}}
}decrement(ref int location)
以原子操作的形式遞減指定變數的值並儲存結果。
increment(ref int location)
以原子操作的形式遞增指定變數的值並儲存結果。
exchange(ref int location1, int value)
以原子操作的形式,將 32 位有符號整數設定為指定的值並返回原始值。
mutex 主要用於程序間同步的同步基元。
); console.writeline(num);
console.readkey();}}
}
static class program
}}
用乙個指示是否將初始狀態設定為終止的布林值初始化 autoresetevent 類的新例項。若為 false,表示起始就是非終止狀態,即是鎖住狀態。
); console.writeline(num);
console.readkey();}}
}waitone()
阻止當前執行緒,直到當前 system.threading.waithandle 收到訊號。
set()
將事件狀態設定為有訊號,從而允許乙個waitone等待執行緒繼續執行。
reset()
將事件狀態設定為非終止,從而導致waitone執行緒受阻。但不會導致本執行緒受阻。
用法類似於 autoresetevent。
區別:在 set 方法上,manualresetevent 每次 set 後會允許所有正在 waitone 的執行緒繼續執行。
需要手動呼叫reset將狀態設定為受阻狀態,autoresetevent.waiteone 相當於 manualresetevent.waiteone;manualresetevent.reset;
提供乙個相互排斥鎖基元,在該基元中,嘗試獲取鎖的執行緒將在重複檢查的迴圈中等待,直至該鎖變為可用為止。注意:spinlock 是結構體
});console.writeline(num);
console.readkey();}}
}除了體系結構上的區別之外, spinlock結構的用法非常類似於 monitor類。獲得鎖定使用 enter()或tryenter()方法,釋放鎖定使用exit()方法。 如果基於物件的鎖定物件( monitor)的系統開銷由於垃圾**而過高,就可以使用 spinlock結構。如果有大量的鎖定(例如,列表中的每個節點都有乙個鎖定),且鎖定的時間總是非常短, spinlock結構就很有用。應避免使用多個spinlock結構,也不要呼叫任何可能阻塞的內容。
可以進行程序間的互斥。
); console.writeline(num);
console.readkey();}}
}訊號量分為兩種型別:本地訊號量和命名系統訊號量。 本地訊號燈對應用程式而言是本地的,系統訊號量在整個作業系統中均可見,適用於程序間同步。 semaphoreslim是 semaphore 不使用 windows 核心訊號量的類的輕型替代項。 與 semaphore 類不同, semaphoreslim 類不支援已命名的系統訊號量。 只能將其用作本地訊號量。 semaphoreslim類是用於在單個應用內進行同步的建議訊號量。
對可同時訪問資源或資源池的執行緒數加以限制的 semaphore 的輕量替代。輕型訊號燈控制對應用程式的本地資源池的訪問。 例項化訊號量時,可以指定可同時進入訊號量的最大執行緒數。 還可以指定可同時進入訊號量的初始執行緒數。 這會定義訊號量的計數。
); console.writeline(num);
console.readkey();}}
}threadstaticattribute只能應用與靜態字段a:");
}});
console.readkey();}}
}實現方法的同步:該方法一次性只能在乙個執行緒上執行。 靜態方法在型別上鎖定,而例項方法在例項上鎖定。 只有乙個執行緒可在任意例項函式中執行,且只有乙個執行緒可在任意類的靜態函式中執行。
); console.writeline(listdate.count);
console.readkey();
}[methodimpl(methodimploptions.synchronized)]
public static void add(listlistdate)
}}列舉幾個執行緒安全的集合類,不用考慮在插入或者刪除時導致列舉失敗。
表示物件的執行緒安全的無序集合。類似於list,但是不能通過索引獲取值
相當於 dictionary,可以通過將 tkey設定為索引相當於list來使用
相當於queue,表示執行緒安全的先進先出 (fifo) 。
相當於stack,表示執行緒安全的後進先出 (lifo) 。
C 執行緒同步
volatile是最簡單的一種同步方法,當然簡單是要付出代價的。它只能在變數一級做同步,volatile的含義就是告訴處理器,不要將我放入工作記憶體,請直接在主存操作我。www.bitscn.com 因此,當多執行緒同時訪問該變數時,都將直接操作主存,從本質上做到了變數共享。能夠被標識為volati...
c 執行緒同步
以乙個程式來說明執行緒不同步所帶來的問題 class program private int counter 0 private void actionmethod t thread.currentthread.name,counter 結果如下 從上面的結果中可以看到主線程和子執行緒都在爭奪act...
C 執行緒同步
使用mutex類來同步兩個單獨的程式。mutex是一種原始的同步方式,其只對乙個執行緒授予對共享資源的獨佔訪問。const string nutexname c using var m new mutex false nutexname else 互斥量是全域性的作業系統物件,請務必正確關閉互斥量。...