线程同步机制:
临界区(Critical Section)、互斥量(Mutex)、事件(Event)、信号量(Semaphore)四种方式
1、临界区:又称阻塞,通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
使用临界区域的第一个忠告就是不要长时间锁住一份资源。这里的长时间是相对的,视不同程序而定。对一些控制软件来说,可能是数毫秒,但是对另外一些程序来说,可以长达数分钟。但进入临界区后必须尽快地离开,释放资源。如果不释放的话,会如何?答案是不会怎样。如果是主线程(GUI线程)要进入一个没有被释放的临界区,呵呵,程序就会挂了!临界区域的一个缺点就是:Critical Section不是一个核心对象,无法获知进入临界区的线程是生是死,如果进入临界区的线程挂了,没有释放临界资源,系统无法获知,而且没有办法释放该临界资源。
2、互斥量:采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享
互斥比较类似阻塞,关键在于互斥可以跨进程的线程同步,而且等待一个被锁住的Mutex可以设定TIMEOUT,不会像Critical Section那样无法得知临界区域的情况,而一直死等。很多只允许应用程序运行一次的实例就是用互斥方法来实现的。当一个互斥对象不再被一个线程所拥有,它就处于发信号状态。此时首先调用waitForsingleobject()的线程就成为该互斥对象的拥有者,此互斥对象设为不发信号状态。当线程调用releaseMutex()并传递一个互斥对象的句柄作为参数时,这种拥有关系就被解除,互斥对象重新进入发信号状态。
3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目, 信号量增加了资源计数的功能,预定数目的线程允许同时进入要同步的代码。
4、事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作
进程通讯机制:
1. 内存映射文件(Memory-MappedFiles)
能使进程把文件内容当作进程地址区间一块内存那样来对待, 进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。
2. 共享内存(Shared Memory)
实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
3. 管道(Pipe)
是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。
匿名管道(Anonymous Pipe)是在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。
4. Sockets
5.WM_COPYDATA消息