zoukankan      html  css  js  c++  java
  • 多线程同步技术(二)

    5.Semaphore

    Semaphore是同一时间允许几个进程同时获取共享资源的,如下例:

    static void Main()
            {
    
                for (int i = 0; i < 6; i++)
                {
                    Console.WriteLine("=========={0}===========",i);
                    Thread t= new Thread(() => {
                        Proc("Thread"+i,i*1000);
                    });
                    Console.WriteLine("=========={0}===========", i);
                    t.Start();
                }
    
                Console.Read();
            }
            static Semaphore sem = new Semaphore(2, 2);
            static void Proc(string name,int secs)
            {
                Console.WriteLine("{0} wait to access",name);
                sem.WaitOne();
                Console.WriteLine("{0} get access",name);
                Thread.Sleep(secs);
                Console.WriteLine("{0} complete", name);
                sem.Release();
            }

    image

    新建立了6个线程,设置最多只有2个线程,每次只有2个线程可以获取资源,等到这个两个线程执行完毕,释放了线程锁,然后余下的线程可以继续获取锁执行;


    6.AutoResetEvent && ManualResetEvent

    static void Main()
            {
                AutoResetEvent ae = new AutoResetEvent(false);//false无信号,当调用的时候是阻塞的
                ManualResetEvent me = new ManualResetEvent(false);
                //AutoResetEvent 执行完之后会自动把把信号量关闭,必须为下面的线程开信号量,下面的线程才可以获取到信号量
                //ManualResetEvent 执行完之后不会把信号量关闭,下面的线程可以继续获取工作
                new Thread(() => {
                    Console.WriteLine("Thread1 entry");
                    //ae.WaitOne();
                    me.WaitOne();
                    Console.WriteLine("Thread1 exit");
                    //ae.Set();//释放信号
                }).Start();
    
                new Thread(() => {
                    Console.WriteLine("Thread2 entry");
                    //ae.WaitOne();
                    me.WaitOne();
                    Console.WriteLine("Thread2 exit");
                }).Start();
                //ae.Set();//释放信号
                me.Set();
                Console.Read();
            }
    image
  • 相关阅读:
    C#操作XML
    Eval调用函数
    SQL 日期时间函数
    vue中created和mounted区别
    记录uniapp的APP端分享到微信好友,链接为小程序页面,分享失败的BUG
    【News】Windows CE会死吗?答,死不了,只是变身了。
    【原创】工作总结
    【原创】工作总结之二
    【资源收集】关于WINCE网卡开发的知识收集
    【news】wince 7 preview release。大家可以去看看
  • 原文地址:https://www.cnblogs.com/yeshuimaowei/p/7459177.html
Copyright © 2011-2022 走看看