在Windows应用程序中多线程很常见,但是之前写的小程序都只用到了简单的线程操作,对于线程间通信较多的程序,该怎么处理呢?
C#给出了一些特定的实现,如果没有想清楚可能会造成很大的麻烦。
对于C#下的语法,查文档一般是MSDN,但是如果不行的话,也可以实验得到,不过对于多线程操作,在不同的CPU上表现不一定一样,通过实验下结论需要特别小心。
windows线程与线程通信
面试被问到过无数次线程与线程通信的概念,首先抄一段:
ref1: https://segmentfault.com/a/1190000008732448
ref2: http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html
进程和线程的区别
- 逻辑层级上的区别:一个程序至少有一个进程,一个进程至少有一个线程.
- 时间尺度上的区别:线程的划分尺度小于进程,使得多线程程序的并发性高。
- 内存管理上的区别:另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
- 操作系统调用上的区别:线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。但是在windows下线程对操作系统可见!
- 总体概念上:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
一些细节 on windows
在运行于32位处理器上的32位Windows操作系统中,可将一个进程视为一段大小为4GB( 字节)的线性内存空间,它起始于0x00000000结束于0xFFFFFFFF。这段内存空间不能被其他进程所访问,所以称为该进程的私有空间。这段空间被平分为两块,TODO👉 2GB被系统所有,剩下2GB被用户所有。 👈TODO! 但是这些空间并不是全部被分配到物理内存上,Windows是按需为每个进程分配内存的,4GB是32位系统中一个进程所占空间的上限。将进程所需的内存划分为4KB大小的内存页,并根据使用情况将这些内存页存储在硬盘上或加载到RAM中,通过系统的这种虚拟内存机制,我们可以有效地减少对实际内存的需求量。当然这些对用户和开发者来说都是透明的。
线程通信/同步
线程同步其实就需要线程通信来实现吧……
同步/互斥。。。
- 共享全局变量、资源,加锁
- 消息
同步方式
- 临界区
- 互斥量
- 信号量
- 事件
C#中相关操作
refs:
https://docs.microsoft.com/zh-cn/dotnet/standard/parallel-programming/index
https://docs.microsoft.com/zh-cn/dotnet/standard/async-in-depth
https://docs.microsoft.com/zh-cn/dotnet/csharp/async