线程同步与异步套接字编程
线程同步与异步套接字编程
事件对象:属于内核对象,可以实现线程同步
事件对象的组成:使用计数
标记是自动重置还是人工重置的布尔值
标记处于通知状态还是未通知状态
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) 编辑 收藏 举报