zoukankan      html  css  js  c++  java
  • C#多线程——同步

    多个线程(不仅仅局限于相同进程)如果需要访问相同的可变资源的话就可能需要考虑到线程同步的手段。CPU的线程和进程管控我这里就不去说了,计算机组成原理里面的东西

    那么既然要让线程的步调一致,那么我们首先可以想到的是,如果一个线程没有完成我们就等,一直等到它完成,但是这种方法会耗费CPU的资源

    Stopwatch sw = Stopwatch.StartNew();
    Thread t1 = new Thread(() =>
    {
    Thread.Sleep(1000);
    result = 100;
    });
    t1.Start();
    Thread.Sleep(500);
    while (t1.IsAlive) ;
    Console.WriteLine(sw.ElapsedMilliseconds);
    Console.WriteLine(result);

    除了这种方式,还可以做轮询的方式,因为傻傻的等实在是太浪费资源了,那么我们每次都去检查一下线程是不是在跑就行了

    Stopwatch sw = Stopwatch.StartNew();
    Thread t1 = new Thread(() =>
    {
    Thread.Sleep(1000);
    result = 100;
    });
    t1.Start();
    Thread.Sleep(500);
    while (t1.IsAlive)
    Thread.Sleep(500);
    Console.WriteLine(sw.ElapsedMilliseconds);
    Console.WriteLine(result);

    另外就是使用join的方式进行阻塞

    Stopwatch sw = Stopwatch.StartNew();
    Thread t1 = new Thread(() =>
    {
    Thread.Sleep(1000);
    result = 100;
    });
    t1.Start();
    Thread.Sleep(500);
    t1.Join();
    Console.WriteLine(sw.ElapsedMilliseconds);
    Console.WriteLine(result);

    然后再看看锁的用法吧,锁在线程里面用的还是蛮多的,除非你用线程池进行多线程管控,相对而言的话锁还是很好的处理机制,让线程按照顺序依次执行

    Stopwatch sw = Stopwatch.StartNew();
    Thread t1 = new Thread(() =>
    {
    lock (locker)
    {
    Thread.Sleep(1000);
    result = 100;
    }
    });
    t1.Start();
    Thread.Sleep(100);
    lock (locker)
    {
    Console.WriteLine(sw.ElapsedMilliseconds);
    Console.WriteLine(result);
    }
  • 相关阅读:
    树的直径 poj 2631
    hdu 3954 Level up(线段树)
    [Java Web]Struts2解决中文乱码问题
    怎样为virtualbox添加新的分辨率
    本人的cocos2d-x之路
    php 中利用json_encode和json_decode传递包括特殊字符的数据
    【设计模式】—— 创建者模式Builder
    【设计模式】——工厂方法FactoryMethod
    【Apache开源软件基金会项目】
    【设计模式】——抽象工厂Abstract Factory
  • 原文地址:https://www.cnblogs.com/yinxuejunfeng/p/9693141.html
Copyright © 2011-2022 走看看