欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Windows学习(011)--内核对象(二)

程序员文章站 2022-06-03 18:19:33
...

事件内核对象

  • 函数原型
HANDLE WINAPI CreateEvent(
  _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
  _In_     BOOL                  bManualReset,
  _In_     BOOL                  bInitialState,
  _In_opt_ LPCTSTR               lpName
);
  • 参数说明

    • lpEventAttributes 安全相关
    • bManualReset如果该参数是TRUE,则该函数将创建一个手动重置事件对象,该对象需要使用ResetEvent函数来将事件状态设置为非信号状态。如果该参数是FALSE,则该函数将创建一个自动重置事件对象,并且系统会自动将事件状态重置为在单个等待线程被释放之后的非信号状态。
    • bInitialState如果该参数为真,则事件对象的初始状态为信号;否则,它是非信号的
    • lpName事件对象的名称。名称仅限于MAX_PATH 长度字符。名称比较是区分大小写的 .此参数如果为NULL,则该内核对象没有名字,则该对象无法被其他进程通过名字来Open.
  • 返回值

    • 如果函数成功,则返回值是事件对象的句柄。如果在函数调用之前存在命名事件对象,那么函数将返回现有对象的句柄,而GetLastError返回ERROR_ALREADY_EXISTS表示已经存在。
    • 如果函数失败,则返回值为NULL。要获得扩展错误信息,请调用GetLastError。
  • 功能说明

    • 该函数通常bManualReset被设置为TRUE,手动设置时间对象信号
    • 在使用的时候可使用ResetEvent,将指定的事件对象设置为非信号状态,使用SetEvent将指定的事件对象设置为信号状态

可等待计时器对象

  • CreateWaitableTimer函数原型
HANDLE WINAPI CreateWaitableTimer(
  _In_opt_ LPSECURITY_ATTRIBUTES lpTimerAttributes,
  _In_     BOOL                  bManualReset,
  _In_opt_ LPCTSTR               lpTimerName
);
  • 参数说明
    • lpTimerAttributes 安全相关
    • bManualReset 如果该参数是TRUE,则计时器是一个手动重置通知计时器。否则,定时器是一个同步计时器
    • lpTimerName 和事件内核对象一样
  • 返回值

    • 如果函数成功,则返回值是事件对象的句柄。如果在函数调用之前存在命名事件对象,那么函数将返回现有对象的句柄,而GetLastError返回ERROR_ALREADY_EXISTS表示已经存在。
    • 如果函数失败,则返回值为NULL。要获得扩展错误信息,请调用GetLastError。
  • 功能说明

    • CreateWaitableTimer在创建后,该内核对象为可通知状态
    • 此状态可有SetWaitableTimer来进行改变
  • SetWaitableTimer函数原型

BOOL SetWaitableTimer(
  HANDLE hTimer,                          // 定时器对象句柄
  const LARGE_INTEGER *pDueTime,          // 设定定时器从何时开始有信号
  LONG lPeriod,                           // 定时器周期
  PTIMERAPCROUTINE pfnCompletionRoutine,  // 回调函数
  LPVOID lpArgToCompletionRoutine,        // 传入回调函数参数
  BOOL fResume                          
);
  • 参数说明
    • pDueTime设置定定时器从什么时候开始,可为相对值,比如,-1000表示当前时间加上1000的时刻,单位是100纳秒
    • lPeriod设置定时器周期,定时使内核对象变成可通知状态,该参数的单位为毫秒
  • 补充
    • 当事件内核对象被设置为自动时,并其为可通知状态,用WaitForSingObject等待它,会使其自动变成不可通知状态,和SetWaitableTimer配合使用,可以实现定时触发某个事件
    • 当多个线程来等待同一个内核对象,操作系统会尽可能使,每个线程都”吃到”这个内核对象,换句话来说,在一个内核对象的可通知状态均匀变换周期内,每个线程都会等到这个对象

信号量

  • CreateSemaphore 函数原型
HANDLE CreateSemaphore(
  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
  LONG lInitialCount,
  LONG lMaximumCount,
  LPCTSTR lpName
);
  • 参数说明
    • lInitialCount表示初始时候可被等待多少次
    • lMaximumCount表示lInitialCount可被设置多少次
  • 返回值
    • 返回信号量对象的句柄表示成功。如果在函数调用之前存在命名的信号量对象,那么GetLastError函数将返回ERROR_ALREADY_EXISTS函数。
    • 零表示失败。要获得扩展错误信息,请调用GetLastError。
  • ReleaseSemaphore 函数原型
BOOL ReleaseSemaphore(
  HANDLE hSemaphore,
  LONG lReleaseCount,
  LPLONG lpPreviousCount
);
  • 参数说明

    • lReleaseCount表示往CreateSemaphore的lInitialCount参数上加lReleaseCount,此参数必须大于0
    • lpPreviousCount 原来lInitialCount的值
  • 补充

    • 创建信号量对象后,就可以用WaitForSingObject来等待,如果其等待计数不为0,信号量为可通知状态,则成功等待,WaitForSingObject返回,并加等待计数减1,当等待计数为0时,WaitForSingObject就会阻塞,信号量是一种可设置等待次数的内核对象
    • ReleaseSemaphore可设置信号量的等待计数,将当前的信号量增加,但不会大于等待计数的最大值

    互斥体

  • CreateMutex函数原型

HANDLE WINAPI CreateMutex(
  _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
  _In_     BOOL                  bInitialOwner,
  _In_opt_ LPCTSTR               lpName
);
  • 参数说明
    • bInitialOwner 表示当前线程是否拥有此互斥体内核对象
  • ReleaseMutex 函数原型
BOOL WINAPI ReleaseMutex(
  _In_ HANDLE hMutex
);
  • 功能:ReleaseMutex用来释放当前线程的互斥体对象,如果该互斥体对象不属于当前线程,则会失败

  • 补充

    • 当当前线程创建了一个属于自己的互斥体,在这个互斥体对象中,就记录了这个线程的ID,那么在此线程中使用wait函数等待此互斥体,则会成功返回,此时,此互斥体对象相对于当前线程是可通知状态,相对于其他线程为不可通知状态;使用ReleaseMutex释放互斥体,互斥体就会将内部的线程ID设置为0,其他线程等待到这个释放的互斥体对象,那么wait会返回,并在内部设置线程ID