1. 程式人生 > >C#多執行緒同步(一)【計數器】

C#多執行緒同步(一)【計數器】

羅馬人凱撒大帝,威震歐亞非三大陸,臨終告訴侍者說:“請把我的雙手放在棺材外面,讓世人看看,偉大如我凱撒者,死後也是兩手空空。

ICounter.cs類:

interface ICounter
    {
        void Increment();
        void Decrement();
    }

Counter.cs類:

 class Counter : ICounter
    {
        private int _count = 0;
        public int Count { get { return _count; } }
        public
void Increment() { _count ++; } public void Decrement() { _count--; } }

CounterLock.cs程式碼:

 class CounterLock : ICounter
    {
        private int _count;

        public int Count { get { return _count; } }
        public void
Increment() { Interlocked.Increment(ref _count); } public void Decrement() { Interlocked.Decrement(ref _count); } }

Test.cs程式碼:

 class Test
    {
        public static void TestCounter(ICounter c)
        {
            for (int i = 0
; i < 100000; i ++) { c.Increment(); c.Decrement(); } } public static void RunTest() { var c1 = new Counter(); var t1 = new Thread((() => TestCounter(c1))); var t2 = new Thread((() => TestCounter(c1))); var t3 = new Thread((() => TestCounter(c1))); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("總數: {0}", c1.Count); Console.WriteLine("--------------------------"); Console.WriteLine("普通計數器"); Console.WriteLine(""); var c2 = new CounterLock(); t1 = new Thread((() => TestCounter(c2))); t2 = new Thread((() => TestCounter(c2))); t3 = new Thread((() => TestCounter(c2))); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("總數: {0}", c2.Count); Console.WriteLine("--------------------------"); Console.WriteLine("執行緒同步的計數器"); Console.ReadKey(); } }

執行結果如圖:

這裡寫圖片描述