线程同步与异步套接字编程

线程同步与异步套接字编程

事件对象:属于内核对象,可以实现线程同步

事件对象的组成:使用计数

标记是自动重置还是人工重置的布尔值

标记处于通知状态还是未通知状态

 

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttributes,

BOOL bManualReset,//人工还是自动重置,true人工,false自动

BOOL bInitialState,//事件初始状态,true有信号,false没信号

LPCTRSTR lpName//事件对象的名称

)

关闭事件对象:CloseHandle(HANDLE hHandle)

设置事件对象为有信号状态:

SetEvent(HANDLE hEvent)

重置事件对象状态:

ResetEvent(HANDLE hEvent)

 

人工重置的事件对象,当事件为有信号状态时,所有等待该对象的线程都变成可调度线程,被某个线程得到后还是有信号状态

自动重置的事件对象,当事件为有信号状态时,只有一个线程变成可调度线程,被某个线程等到后,操作系统会讲该事件设置为无信号状态

自动重置的事件,当对所保护的代码执行完成后,需要调用SetEvent函数将该事件对象设置为无信号状态

为了实现线程间的同步,不应该使用人工重置的事件对象,而应该使用自动重置的事件对象

通过创建一个命名的事件对象,可以实现应用程序只有一个实例运行的功能

 

关键代码段:也称临界区,工作在用户方式下,是指一个小代码段,在代码能够执行前,它必须独占某些资源的访问权。通常把多线程中访问同一资源的那部分代码当做关键代码段

 

void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection)//参数作为返回值使用

void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)//参数作为返回值使用

void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)//参数作为返回值使用

void DeleteCriticalSection(LPCRITICAL _SECTION lpCriticalSection)//参数作为返回值使用

 

线程死锁:对于多线程,都在等待对方所占用的资源

 

互斥对象和事件对象都属于内核对象,速度较慢,可以在多个进程中的各个线程间进行同步

 

关键代码段在用户方式下,同步速度较快,但很容易进入死锁状态,因为在等待进关键代码段时,无法设定超时值

posted on 2014-03-11 23:29  DaMengZhang  阅读(715)  评论(0编辑  收藏  举报