C#多线程源代码实例包含lock, Monitor, mutex

using System; using System.Collections; using System.Text; using System.Threading; public class CRunMain { public static void Main() { //SyncThread1(); //SyncThread2(); SyncThread3(); } public static void SyncThread1() { CTest test = new CTest(1000); Thread trd1 = new Thread(new ThreadStart(test.Add)); Thread trd2 = new Thread(new ThreadStart(test.Sub)); trd1.Start(); trd2.Start(); while (true) { Console.WriteLine("===================== main thread is running ==================="); Thread.Sleep(100); } } public static void SyncThread2() { CTest2 test = new CTest2(100); Thread trd1 = new Thread(new ThreadStart(test.Add)); Thread trd2 = new Thread(new ThreadStart(test.Sub)); trd1.Start(); trd2.Start(); while (true) { Console.WriteLine("===================== main thread is running ==================="); Thread.Sleep(100); } } public static void SyncThread3() { CTest3 test = new CTest3(10); Thread trd1 = new Thread(new ThreadStart(test.Add)); Thread trd2 = new Thread(new ThreadStart(test.Sub)); trd1.Start(); trd2.Start(); while (true) { Console.WriteLine("===================== main thread is running ==================="); Thread.Sleep(1000); } } } public class CTest3 { private Mutex m_objMutex; private int m_nCount = 0; public CTest3(int nVal) { m_objMutex = new Mutex(); m_nCount = nVal; } public void Add() { while (true) { m_objMutex.WaitOne(); m_nCount += 1; Console.WriteLine("after add 1" + "\tnCount = " + m_nCount); m_objMutex.ReleaseMutex(); if (m_nCount > 0) { Thread.Sleep(1000); } } } public void Sub() { while (true) { m_objMutex.WaitOne(); m_nCount -= 1; Console.WriteLine("after sub 1" + "\tnCount = " + m_nCount); m_objMutex.ReleaseMutex(); if (m_nCount < 0) { Thread.Sleep(1000); } } } } public class CTest2 { private object m_objLock = new object(); private int m_nCount = 0; public CTest2(int nVal) { m_nCount = nVal; } public void Add() { while (true) { Monitor.Enter(m_objLock); m_nCount += 1; Console.WriteLine("after add 1" + "\tnCount = " + m_nCount); Monitor.Exit(m_objLock); if (m_nCount > 0) { Thread.Sleep(100); } } } public void Sub() { while (true) { Monitor.Enter(m_objLock); m_nCount -= 1; Console.WriteLine("after sub 1" + "\tnCount = " + m_nCount); Monitor.Exit(m_objLock); if (m_nCount < 0) { Thread.Sleep(100); } } } } public class CTest { private object objLock = new object(); private int m_nCount = 100; public CTest(int nVal) { m_nCount = nVal; } public void Add() { while (true) { lock(objLock) { m_nCount += 1; Console.WriteLine("after add 1" + "\tnCount = " + m_nCount); } if (this.m_nCount > 0) { Thread.Sleep(10); } } } public void Sub() { while (true) { lock (objLock) { m_nCount -= 1; Console.WriteLine("after sub 1" + "\tnCount = " + m_nCount); } if (this.m_nCount < 0) { Thread.Sleep(10); } } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值