• 多线程数据与控制同步


    一,数据同步

    CLR的数据同步包装简单到用c#用Lock关键字,vb.net用SyncLock围出一个临界域就好了。更细一步的话,提
    供了读写锁类ReaderWriterLockSlim 类,这是在3.5后出现的类,用于取代1.1的ReaderWriterLock 类。
    ReaderWriterLock直到2.0修复了部分问题但是还存在些问题,这里有篇很好的文章说明了读写锁。通过读写锁,不必什么都是独占
    锁,共读提高性能。
    二,控制同步
    CLR提供了Monitor类,其有三个方法:
    Wait(object obj);
    Monitor.Pulse(object obj);
    Monitor.PulseAll(object obj);
    当前线程调用Monitor.Wait后,围绕obj建立的事件队列则添加一个通知对象。
    Monitor.Pulse(object obj)采用先进先出原则,通知事件队列中的一个线程。
    Monitor.PulseAll(object obj)遍历通知所有线程。
    实现自己的线程池,或其他需要同步的场景一般都会用这个三个方法实现同步。
    以下是个小实例,可以试着调试玩玩。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace ControlSynTest
    {
        class Program
        {
            static int synValue = 0;
            static object synobj = new object();
            static void Main(string[] args)
            {
                Thread thr1 = new Thread(new ThreadStart(Work1));
                Thread thr2 = new Thread(new ThreadStart(Work2));
                Thread thr3 = new Thread(new ThreadStart(Work3));
                
                thr3.Start();
                thr2.Start();
                thr1.Start();
                Console.Read();
            }
    
            protected static void Work1()
            {
                lock (synobj)
                {
                    while (synValue != 0)
                    {
                        Monitor.Wait(synobj);
                    }
                    synValue++;
                    Monitor.PulseAll(synobj);
                    Console.WriteLine("Work1:"+ synValue.ToString());
                }
            }
    
            protected static void Work2()
            {
                lock (synobj)
                {
                    while (synValue != 1)
                    {
                        Monitor.Wait(synobj);
                    }
                    synValue++;
                    Monitor.Pulse(synobj);
                    Console.WriteLine("Work2:" + synValue.ToString());
                }
                
            }
    
            protected static void Work3()
            {
                lock (synobj)
                {
                    while (synValue != 2)
                    {
                        Monitor.Wait(synobj);
                    }
                    synValue-=2;
                    Monitor.Pulse(synobj);
                    Console.WriteLine("Work3:" + synValue.ToString());
                }
            }
        }
    }
    

      

  • 相关阅读:
    洛谷P2661: 信息传递(图的遍历)
    洛谷P1305: 新二叉树
    洛谷 P1030 :求先序排列
    POJ 3041:Asteroids(二分图最大匹配)
    洛谷P2774 :方格取数问题( 网络流24题 奇偶建图+最小割)
    hdu 3061:Battle(最大权闭合图)
    hdu 1532:Drainage Ditches(Dinic算法)
    洛谷P1345: [USACO5.4]奶牛的电信Telecowmunication(拆点+最小割)
    hihoCoder1121 : 二分图一•二分图判定
    (转载)javascript客户端生成MD5值的函数代码
  • 原文地址:https://www.cnblogs.com/wusong/p/2605238.html
Copyright © 2020-2023  润新知