C#多线程锁

来源:互联网 发布:致胜轮毂数据 编辑:程序博客网 时间:2024/06/07 12:31

C#开发中会常遇到多线程的问题,当多个线程同时对同一个资源进行操作时,就需要注意线程同步的问题。线程如果不同步,可能会造成与预计不同的结果,这时就要对资源进行上锁。当多个线程操作一个全局变量时,如果对全局变量进行上锁,则当一个线程访问这个全局变量时,另一个线程并不能去访问这个全局变量,只有等解锁资源后,其余线程才有机会去访问。这就保证了线程同步。下面是示例:
两个线程fun1和fun2同时对队列进行入队操作,当入队数量比较小时,可能没有问题,当数量较大时,会发现队列中元素个数并不是两个线程入队元素的和。

   public class student        {            public int age;            public string name;            public int num;        }        Queue<student> q= new Queue<student>();        public void fun1()        {                     Monitor.Enter(this);//锁定,保持同步            student s = new student();            for (int i = 0; i < 2000000; i++)            {                s.num = 1;                s.age = i;                s.name = "A" + i.ToString();                q.Enqueue(s);            }            Monitor.Exit(this);//取消锁定        }        public void test_queue_nolock()        {            Thread t1= new Thread(new ThreadStart(fun1));            t1.Name="线程1";            t1.Start();            Thread t2 = new Thread(new ThreadStart(fun1));            t2.Name = "线程2";            t2.Start();               }        private void btn_test_Click(object sender, EventArgs e)        {            test_queue_nolock();            timer_dequeue.Enabled = true;        }        private void timer_queue_Tick(object sender, EventArgs e)        {            Console.WriteLine("队列写入了{0}条数据", q.Count);        }

其中线程的启动为:
1)不带参数的启动:Thread t1= new Thread(new ThreadStart(fun1));
然后再 t1.start()开启该线程
2)带参数的启动方法,就要使用ParameterizedThreadStart委托来实例化Thread了,和ThreadStart一样的是它也是线程启动时要执行的方法,和ThreadStart不同的是,它在实例化时可以用一个带有一个Object参数的方法作为构造函数的参数,而实例化ThreadStart时所用到的方法是没有参数的。ParameterizedThreadStart定义为:
public delegate void ParameterizedThreadStart(object obj);
Thread t1= new Thread(new ThreadStart(fun1));
t1.start(100);此时的fun1应该有一个object 参数
具体可参考:http://blog.csdn.net/zhoufoxcn/article/details/4402999

0 0