Sleep(0)和Yield在调整代码性能时偶尔有用,它也是一个很好的诊断工具,可以用于找出线程安全(thread safety)的问题 。如果在你代码的任意位置插入Thread.Yield()会影响到程序,基本可以确定存在 bug 。
二、原理硬件结构https://xiaolincoding.com/os/1_hardware/how_cpu_run.html#图灵机的工作方式
运行时??线程在内部由一个 线程调度器(thread scheduler) 管理,一般 CLR 会把这个任务交给操作系统完成 。线程调度器确保所有活动的线程能够分配到适当的执行时间,并且保证那些处于等待或阻塞状态(例如,等待排它锁或者用户输入)的线程不消耗CPU时间 。
??在单核计算机上,线程调度器会进行 时间切片(time-slicing),快速的在活动线程中切换执行 。在 Windows 操作系统上,一个时间片通常在十几毫秒(译者注:默认 15.625ms),远大于 CPU 在线程间进行上下文切换的开销(通常在几微秒区间) 。
??在多核计算机上,多线程的实现是混合了时间切片和 真实的并发(genuine concurrency),不同的线程同时运行在不同的 CPU 核心上 。仍然会使用到时间切片,因为操作系统除了要调度其它的应用,还需要调度自身的线程 。
??线程的执行由于外部因素(比如时间切片)被中断称为 被抢占(preempted) 。在大多数情况下,线程无法控制其在什么时间,什么代码块被抢占 。
??多线程同样也会带来缺点,最大的问题在于它提高了程序的复杂度 。使用多个线程本身并不复杂,复杂的是线程间的交互(共享数据)如何保证安全 。无论线程间的交互是否有意为之,都会带来较长的开发周期,以及带来间歇的、难以重现的 bug 。因此,最好保证线程间的交互尽可能少,并坚持简单和已被证明的多线程交互设计 。三、基础创建与启动使用Thread类的构造方法来创建线程,支持以下两种委托
??当频繁地调度和切换线程时(且活动线程数量大于 CPU 核心数),多线程会增加系统资源和 CPU 的开销,线程的创建和销毁也会增加开销 。多线程并不总是能提升程序的运行速度,如果使用不当,反而可能降低速度 。
public delegate void ThreadStart();public delegate void ParameterizedThreadStart (object? obj);
关于Thread构造重载方法参数 maxStackSize,不建议使用https://stackoverflow.com/questions/5507574/maximum-thread-stack-size-net
public void 创建一个线程(){var t = new Thread(Go);// 开一个线程tt.Start();// 启动t线程,执行Go方法Go();// 主线程执行Go方法}void Go(){_testOutputHelper.WriteLine("hello world!");}
每一个线程都有一个 Name 属性,我们可以设置它以便于调试 。线程的名字只能设置一次,再次修改会抛出异常 。public void 线程命名(){var t = new Thread(Go);// 开一个线程tt.Name = "worker";t.Start();// 启动t线程,执行Go方法Go();// 主线程执行Go方法}void Go(){// Thread.CurrentThread属性会返回当前执行的线程_testOutputHelper.WriteLine(Thread.CurrentThread.Name + " say: hello!");}
传递参数Thread类的Start方法重载支持向thread实例传参public void Start(object? parameter)
参数被lambda表达式捕获,传递给Go方法public void 创建一个线程(){var t = new Thread(msg => Go(msg));// 开一个线程tt.Start("hello world!");// 启动t线程,执行Go方法Go("main thread say:hello world!");// 主线程执行Go方法}void Go(object? msg){_testOutputHelper.WriteLine(msg?.ToString());}
请务必注意,不要在启动线程之后误修改被捕获变量(captured variables)public void 闭包问题(){for (int i = 0; i < 10; i++){new Thread (() => Go(i)).Start();}}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- go GMP
- 豆腐在冷藏室可以放几天
- 200ml牛奶是多少克
- 一碗米饭的热量是多少
- 45岁男士体脂率多少正常 45岁男人体脂率多少
- 70多岁还能骑自行车吗 70岁老人能骑自行车吗
- 虾干热量有多少 虾干的热量是多少
- 一个水煮蛋多少大卡
- 板栗放冰箱里能存放多久
- 螃蟹干放着能活多久