第16章、线程同步与异步套接字编程
1. 另外两种线程同步的方法:事件对象和关键代码段;
2. 事件对象有两种不同的类型:
1. 人工重置的事件对象:当它得到通知的时,等待该事件对象的所有线程均变为可调度线程;
2. 自动重置的事件对象:当它得到通知的时,等待该事件对象的线程中只有一个线程变为可调度线程;
3. 事件对象与互斥对象都是属于内核对象;
创建事件对象:CreateEvent
第二个参数为TRUE,创建一个人工重置事件对象:当线程等待到该对象的所有权之后,需要调用ResetEvent函数手动地将该事件对象设置为无信号状态;
为FALSE,创建一个自动重置事件对象:当线程等到该对象的所有权之后,系统会自动将该对象设置为无信号状态;
4. SetEvent函数将把指定的事件对象设置为有信号状态;
5. ResetEvent函数把指定的事件对象设置为无信号状态;
6. 关键代码段(也称临界区,指一小段代码,在代码能够执行前,它必须独占对某些资源的访问权)
InitializeCriticalSection()函数初始化一个关键代码段;
EnterCriticalSection()函数,以获得指定的临界区对象的所有权
LeaveCriticalSection()函数,释放指定的临界区的所有权;
DeleteCriticalSection函数释放该对象;
7. 三种线程同步的方式的比较:
1. 互斥对象和事件对象都属于内核对象,利用内核对象进行线程同步时,速度比较慢,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中的各个线程间进行同步;
2. 关键代码段工作在用户方式下,同步速度较快,但在使用关键代码段时,很容易进入死锁状态,因为在等待进入关键代码段时无法设定超时值;
8. Windows套接字在两种模式下执行I/O操作:阻塞模式和非阻塞模式。
在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回(也就是不会将控制权交还给程序),从而导致调用线程暂停运行;
非阻塞模式是会立即返回的;
9. 在WindowsSockets中,对增加的扩展函数来说,前面都有WSA前缀;
10.基于消息的异步套接字:在编写网络应用程序的时,采用异步选择机制可以提高网络应用程序的性能;如果再配合多线程技术,将大大提高所编写的网络应用程序的性能;