多线程的自动管理各类锁的不同 线程池例子

Lock锁定一个引用对象,(不能锁定值类型,因为值类型传递的是拷贝,所以每次都是不同的值,没法lock)

lock(expression) statement_block

expression代表你希望跟踪的对象,通常是对象引用。

  • 如果你想保护一个类的实例,一般地,你可以使用this;
  • 如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。

而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。

Monitor类不仅可以完全取代lock语句,还可以使用TryEntry方法设置一个锁定超时,单位是毫秒。

ThreadPool: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应

这一般使用ThreadPool(线程池)来解决;

另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒

这一般使用Timer(定时器)来解决;


class Program
    {       
        static void Main(string[] args)
        { 
            int maxCount = 10;
            Alpha alpha=new Alpha(10);
            ManualResetEvent eventX = new ManualResetEvent(false);
            alpha.xEvent = eventX;
            for (int iItem = 1; iItem <= maxCount; iItem++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(alpha.Beta),new SomeState(iItem));
            }
            Console.WriteLine("Waiting for Thread Pool to drain");
           
            eventX.WaitOne(Timeout.Infinite, true);
            for (int i = 0; i < alpha.list.Count();i++ )
            {
                Console.WriteLine(alpha.list[i].ToString());
            }
            Console.ReadKey();
        }




    }
    public class SomeState
    {
        public int Cookie;
        public SomeState(int iCookie)
        {
            Cookie = iCookie;
        }
    }


    public class Alpha
    {
        public ManualResetEvent xEvent;
        public  int iMaxCount = 0;
        public int icount = 0;
        public List<string> list = new List<string>();
        public Alpha(int MaxCount)
        {
            iMaxCount = MaxCount;
        }
        public void Beta(Object State)
        {
            lock (list)
            {
                list.Add(icount.ToString());
                Thread.Sleep(100);
            }
            Interlocked.Increment(ref icount);//InterLocked类也是专为多线程程序而存在的,它提供了一些有用的原子操作
            if (icount == iMaxCount)
            {
                Console.WriteLine("Finished all events");
                xEvent.Set();
            }
        }
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值