zoukankan      html  css  js  c++  java
  • 多线程数据与控制同步

    一,数据同步

    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());
                }
            }
        }
    }
    

      

  • 相关阅读:
    在 easyui中获取form表单中所有提交的数据 拼接到table列表中
    easyui中清空table列表中数据
    easyui中加载table列表数据 第一次有数据第二次没有数据问题
    jsp中将一个jsp引入另一个jsp指定位置
    maven项目修改名称后,打包名称和现在名称不一致
    动态sql
    日期转化类 ,日期格式处理
    easyui中权限分配和添加 前后端代码
    ubuntu14.04下播放器SMplayer的安装
    C++的 new 和 detele
  • 原文地址:https://www.cnblogs.com/wusong/p/2605238.html
Copyright © 2011-2022 走看看