博客
关于我
c#线程-线程同步
阅读量:598 次
发布时间:2019-03-12

本文共 5791 字,大约阅读时间需要 19 分钟。

????

???????????????????????????????????????????????????????????????????????????????????????????????

???????

????

????? Sleep?Join?EndInvoke ????????????????Sleep ?????????CPU?? Join?EndInvoke ????????????????????CPU???????????????????????

static void Main(){    Thread t = new Thread(Go);    Console.WriteLine("Main???????");    t.Start();    t.Join(); // ??Main??    Console.WriteLine("Main????????????");}static void Go(){    Console.WriteLine("?t?????Go???");}
static void Main(){    Console.WriteLine("Main???????");    Thread.CurrentThread.Sleep(3000); // ??????    Console.WriteLine("Main?????????????);}
static void Main(){    Task Task1 = Task.Run(() =>    {        Console.WriteLine("task??????);        Thread.Sleep(1000);    });    Console.WriteLine(Task1.IsCompleted);    Task1.Wait(); // ????????Task1??    Console.WriteLine(Task1.IsCompleted);}
???Lock?

??????????????????????????????????????????????????

  • ???????????????????????????
  • private????? lock (this) ? lock (typeof(??)) ????? private??????
  • ???????????
  • ???????? await?
  • ???????????????????????????????????????????????
  • class ThreadSafe{    private static object _locker = new object();    void Go()    {        lock (_locker)        {            // ?????????????????????????????        }    private object _locker2 = new object();    void GoTo()    {        lock (_locker2) // ??????????????????????????????????????    }}
    Monitor

    lock ? Monitor ??????lock (x) ????

    System.Object obj = x;System.Threading.Monitor.Enter(obj);try{    // ????}finally{    System.Threading.Monitor.Exit(obj);}

    ????Mutex?

    ??????????????????????????????????

    class Program{    public static Mutex mutex = new Mutex();    static void Main(string[] args)    {        for (int i = 0; i < 3; i++)        {            Thread test = new Thread(MutexMethod);            test.Start();        }        Console.Read();    }    public static void MutexMethod()    {        Console.WriteLine("{0} ???????", Thread.CurrentThread.Name);        mut.WaitOne();        Console.WriteLine("{0} ???????", Thread.CurrentThread.Name);        Thread.Sleep(1000);        Console.WriteLine("{0} ???????", Thread.CurrentThread.Name);        mut.ReleaseMutex();        Console.WriteLine("{0} ???????", Thread.CurrentThread.Name);    }}

    ?????

    ????????????????????????AutoResetEvent ? ManualResetEvent ????????

    AutoResetEvent

    AutoResetEvent ???????????????????????? false?WaitOne ??????????????? true?

    class ThreadSafe{    static AutoResetEvent autoEvent;    static void Main()    {        autoEvent = new AutoResetEvent(false);        Console.WriteLine("??????");        Thread t = new Thread(DoWork);        t.Start();        Console.WriteLine("???sleep 1??");        Thread.Sleep(1000);        Console.WriteLine("????????");        autoEvent.Set();    }    static void DoWork()    {        Console.WriteLine("t????DoWork?????????main?????");        autoEvent.WaitOne();        Console.WriteLine("t??DoWork?????main???????????);    }}
    ManualResetEvent

    ManualResetEvent ???????????Set ?????????????????WaitOne ?????????????????????

    class ThreadSafe{    private static ManualResetEvent mre = new ManualResetEvent(false);    static void Main()    {        for (int i = 0; i <= 2; i++)        {            Thread t = new Thread(ThreadProc);            t.Name = "Thread_" + i;            t.Start();        }        Thread.Sleep(500);        Console.WriteLine("??????????????????Set??????");        mre.Set();        Thread.Sleep(500);        Console.WriteLine("?ManualResetEvent??????????Wait.One?????????????");        for (int i = 3; i <= 4; i++)        {            Thread t = new Thread(ThreadProc);            t.Name = "Thread_" + i;            t.Start();        }        Thread.Sleep(500);        Console.WriteLine("??Reset???ManualResetEvent????????????Wait.One??????????");        mre.Reset();        Thread t5 = new Thread(ThreadProc);        t5.Name = "Thread_5";        t5.Start();        Thread.Sleep(500);        Console.WriteLine("??Set?????????");        mre.Set();    }    private static void ThreadProc()    {        string name = Thread.CurrentThread.Name;        Console.WriteLine(name + " ?????WaitOne()");        mre.WaitOne();        Console.WriteLine(name + " ??");    }}
    Interlocked

    Interlocked ??????????????????????????????

    public static class InterlockedExample{    private static int _sharedValue = 0;    public static void IncrementValue(ref int location)    {        Interlocked.Add(ref location, 1);    }    public static void CompareExchange(ref int location, int value, int comparand)    {        if (Interlocked.CompareExchange(ref location, value, comparand) == comparand)        {            // ??????????????        }    }}
    ReaderWriterLock

    ReaderWriterLock ????????????????????????????

    class Program{    public static ReaderWriterLock readerwritelock = new ReaderWriterLock();    static void Main(string[] args)    {        Thread t1 = new Thread(Write);        t1.Start();        Thread t2 = new Thread(Write);        t2.Start();        for (int i = 3; i < 6; i++)        {            Thread t = new Thread(Read);            t.Start(i);        }        Console.Read();    }    private static void Write(object i)    {        Console.WriteLine("???" + i + "????");        readerwritelock.AcquireWriterLock(Timeout.Infinite);        Console.WriteLine("???" + i + " ???" + DateTime.Now);        Thread.Sleep(1000);        Console.WriteLine("???" + i + "?????);        readerwritelock.ReleaseWriterLock();    }    private static void Read(object i)    {        Console.WriteLine("???" + i + "????");        readerwritelock.AcquireReaderLock(Timeout.Infinite);        Console.WriteLine("???" + i + " ???" + DateTime.Now);        Thread.Sleep(1000);        Console.WriteLine("???" + i + "?????);        readerwritelock.ReleaseReaderLock();    }}

    转载地址:http://xurtz.baihongyu.com/

    你可能感兴趣的文章
    Node-RED中使用node-red-contrib-image-output节点实现图片预览
    查看>>
    Node-RED中使用node-red-node-ui-iframe节点实现内嵌iframe访问其他网站的效果
    查看>>
    Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
    查看>>
    Node-RED中使用range范围节点实现从一个范围对应至另一个范围
    查看>>
    Node-RED中实现HTML表单提交和获取提交的内容
    查看>>
    Vue3+elementplus实现图片上传下载(最强实践)
    查看>>
    Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
    查看>>
    Node-RED中建立TCP服务端和客户端
    查看>>
    Node-RED中建立Websocket客户端连接
    查看>>
    Node-RED中建立静态网页和动态网页内容
    查看>>
    Vue3+Element-ul学生管理系统(第二十二课)
    查看>>
    Node-RED中怎样让网站返回JSON数据
    查看>>
    Node-RED中根据HTML文件建立Web网站
    查看>>
    Node-RED中解析高德地图天气api的json数据显示天气仪表盘
    查看>>
    Node-RED中连接Mysql数据库并实现增删改查的操作
    查看>>
    Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
    查看>>
    Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
    查看>>
    Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
    查看>>
    Node-RED怎样导出导入流程为json文件
    查看>>
    Node-RED简介与Windows上安装、启动和运行示例
    查看>>