疫情当前,呆着家里,总结关于工作中遇到的问题和解决思路,是一个很好的学习机会,珍爱生命,懂得感恩,一切会好起来的。
一、写在之前
之前的一篇文章中https://blog.csdn.net/THUNDERDREAMER_OR/article/details/104213670,我提到了网格规划算法的计算量比较大,对三个切面分别进行计算的时候,使用多线程是一个不错的想法,实际上我也是这么做的。现在我们来分析一下,怎样使用C#的Threading自己动手实现多线程并行计算。
知识预热。涉及到多线程,不得不说多因线程之间的通信和竞争而导产生问题,因此锁机制和“死锁”的概念便应用而生。
- 锁机制
在竞争态条件下,多个线程对同一竞态资源的抢夺会引发线程安全问题。竞态资源是对多个线程可见的共享资源,主要包括全局(非const)变量、静态(局部)变量、堆变量、资源文件等。
线程之间的竞争,可能带来一系列问题:
- 线程在操作某个共享资源的过程中被其他线程打断,时间片耗尽而被迫切换到其他线程
- 共享资源被其中一个线程修改之后,并未通知同步到其他线程,造成线程间的数据访问不一致
- 编译器优化等导致若干操作指令的执行顺序打乱而造成的结果
为了解决由多进程多资源的同时操作引起的问题,提出了锁机制。在某一时刻只允许有一个进程运行它的临界区代码,从而保证临界资源的中数据的一致性。临界资源是指能够被多个线程共享的数据、资源。临界区代码是指多临界资源操作的那段代码。
这里只介绍互斥锁(mutex lock)的概念和原理,另外一种是自旋