我正在使用Windows键控事件进行自定义同步原语,受http://locklessinc.com/articles/keyed_events/启发
为了支持线程中断,我改变了阻塞调用的地方,例如Sleep或WaitForSingleObject被用于他们的可警告版本,如SleepEx和WaitForSingleObjectEx。然后我可以通过使用QueueUserAPC排队APC来中断等待,如果返回是WAIT_IO_COMPLETION,则抛出一个特殊的异常,导致所有的析构函数被调用,然后线程退出。这类似于Linux版本的pthread_cancel(),它会导致堆栈展开,因此当线程退出时会清理内容。
我看到NtWaitForKeyedEvent()也有一个Alertable参数,所以我想知道我是否可以为这个案例做同样的事情,或者有警告?如果APC将其唤醒,我也不知道要查找什么返回值,因为NTSTATUS不直接对应于WIN32返回码。有一个STATUS_USER_APC和一个STATUS_ALERTED,我不知道它是否是这两个中的任何一个。如果用户APC功能不足以提醒键控事件等待,那么是什么?
答案 0 :(得分:1)
NtWaitForKeyedEvent
看起来会像你想做的那样。这是您使用NtWaitForSingleObject
设置的参数,用于启用APC的接收。
如果由于正在运行APC而等待完成,您将收到STATUS_USER_APC
,如果与您的线程相关联,则会调用STATUS_ALERTED
NtAlertThread
。如果你想要的只是一个停止等待的信号,NtAlertThread
就足够了。
如果您的异常处理机制确实SEH展开,您可以直接从APC例程中抛出特殊异常。