我刚刚意识到我的APC被另一个线程中断。 所以在这一点上我想知道这可能是怎么回事。 正如我理解的APCs的概念:异步过程调用被另一个线程中断?
- 一个APC不能由普通用户模式线程
- 的APC被尽快调度中断其由函数QueueUserAPC()
- 的APC具有请求运行至完成语义
所以这是我的初步情况: 我有一个多线程应用程序(1个主线程,1个接待线程)。 低优先级的接收线程正在从外部源接收数据。 接收线程也通过使用WaitForSingleObject()
重新激活。收到的数据存储在共享的std::list
中。主线程没有任何效果。 每x毫秒都会发生一个特殊事件,导致接收线程分派APC。 此APC正在主线程的上下文中运行。
所以这里是整个情况的一个例子伪源代码。
class Example {
public:
Example(void) {
::DuplicatHandle(
::GetCurrentProcess(),
::GetCurrentThread(),
::GetCurrentProcess(),
&m_mainthreadHandle,
THREAD_SET_CONTEXT,
FALSE,
0);
}
void run(void) {
::WaitForSingleObjectEx(m_apcActivation);
}
protected:
private:
void rxThread(void) {
// this seems to be called during the apcRoutine() is running
// as result the shared list m_rxList is corrupted!
::WaitForSingleObject(m_externalActivation);
Data data = externalReceive();
if(data.attribute == SPECIAL) {
::QueueUserAPC(apcRoutine, m_mainthreadHandle, 0);
} else {
m_rxList.push_front(data);
}
}
void apcRoutine(void) {
while(!m_rxList.empty()) {
m_rxList.front().print();
m_rxList.pop_front();
}
}
std::list<Data> m_rxList;
HANDLE m_externalActivation;
HANDLE m_apcActivation;
HANDLE m_mainthreadHandle;
};
void main(void) {
Example e;
e.run();
}
我的问题是: 是否有可能,前台线程WaitForSingleObject()
中断APC? 如果是,为什么?
很遗憾,我只能奖励+1 :( –