【发布时间】:2023-03-18 08:34:01
【问题描述】:
我刚刚意识到我的 APC 被另一个线程中断了。 所以在这一点上,我想知道这怎么可能。 据我了解 APC 的概念:
- 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?
如果是,为什么?
【问题讨论】:
标签: c++ multithreading apc