文件内核对象
CreateFile函数可以用来创建和打开磁盘文件,同时可以打开很多其他设备,例如串口、邮件槽服务器、命名管道等等。
文件的读写共享模式:
文件指针位置:
调用CreateFile系统会创建一个内核对象管理对文件的操作,其中记录文件的指针,标识文件下一次读取或写入的位置。
通过SetFilePointerEx可以设置或获取当前位置:
线程内核对象
组成:一个线程包括仅包括一个线程堆栈和一个线程内核对象
线程堆栈:用于维护线程在执行代码时需要的所有函数参数和局部变量。
线程内核对象:操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息。(此处内核对象专指线程内核对象)
生命周期:线程总是创建于某个进程环境中,其生命周期仅存在于创建它的进程生命周期内。
执行位置:线程在进程的地址空间中执行代码并进行数据操作。从属于同一进程的线程共享进程的地址空间,可以执行一样的代码并对一样的数据进行操作,共享该进程的内核句柄。
通过内核对象同步线程
1.事件内核对象(Event)
事件包含一个引用计数,一个用来表示事件是自动重置事件还是手动重置事件的布尔值,以及另一个用来表示事件有没有被触发的布尔值。
HANDLE CreateEvent( PSECURITY_ATTRIBUTES psa, BOOL bManualReset,BOOL bInitialState,PCTSTR pszName
HANDLE OpenEvent( DWORD dwDesiredAccess, BOOL bInherit, PCTSTR pszName)
BOOL SetEvent(HANDLE hEvent);//触发事件
BOOL ResetEvent(HANDLE hEvent);//把事件设为未触发状态
BOOL PulseEvent(HANDLE hEvent);//先触发事件后立即恢复到未触发状态
2.可等待的计时器内核对象(Waitable Timer)
可以在某个指定的时间触发,或每隔一段时间触发一次。
HANDLE CreateWaitableTimer( PSECURITY_ATTRIBUTES psa, BOOL bManualReset, PCTSTR pszName)
;HANDLE OpenWaitableTimer( DWORD dwDesiredAccess, BOOL bInheritHandle, PCTSTR pszName);
BOOL CancelWaitableTimer(HANDLE hTimer);//取消计时器
3.信号量内核对象(Semaphore)
包含一个使用计数,还有一个最大资源计数,一个当前资源计数。
HANDLE CreateSemaphore( PSECURITY_ATTRIBUTE psa, LONG lInitialCount, LONG lMaximumCount, PCTSTR pszName);
BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount,PLONG plPreviousCount4.互斥量内核对象(Mutex)
信号量对象包含一个使用计数、线程ID以及一个递归计数。线程ID用来标识当前占用这个互斥量的是系统中哪个线程,递归计数表示这个线程占用该互斥量的次数。
4.互斥量的使用规则:
1如果线程ID为0(无效),那么该互斥量不为任何线程所占用,他处于触发状态。
2如果线程ID为非0值,那么有一个线程已经占用了该互斥量,他处于未触发状态
3与所有其他内核对象不同,操作系统对互斥量进行了特殊处理,允许它们违反一些常规的规则(下面说)
HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, BOOLbInitialOwner, LPCTSTRlpName);
BOOL ReleaseMutex(HANDLE hMutex);