我正在尝试用Visual Studio 2010和WINAPI开发嵌入式硬件模拟器。 当我试图模拟中断时我遇到了问题... 中断行为如下...... 当一个threadA工作,同时出现一个中断, 所以threadA将被保持并跳转以执行ISR功能 ISR功能已经完成,threadA可以恢复并继续工作......
我试图通过多线程模拟这个动作 所以有一个名为interrupt-thread的线程,它将挂起threadA和 执行ISR操作然后恢复threadA,就像下面的代码一样......
但问题是我的代码在调用sespendthread()时会被卡住 可以看到之前的printf(“a”),但是printf(“b”)不能......
有没有其他方法可以用MSDN模拟中断? 我考虑过使用singals和signalhandler来解决这个问题, 但看起来windows信号无法发送到特定的线程, 只能发送到特定的流程......
HANDLE thd_main;
HANDLE thd_int;
HANDLE Array_Of_Thread[2];
thd_main(){
while(1){
/* polling for jobs and do specific operation */
}
}
thd_int(){
while(1){
if (WaitForSingleObject(g_timer, infinite) == WAIT_TIMEOUT){
printf("a");
suspendthread(thd_main);
printf("b");
/* ISR operation */
resumethread(thd_main);
}
}
}
int main()
{
thd_main = CreateThread( NULL, 0,
Thread_main, NULL, 0, NULL);
thd_int = CreateThread( NULL, 0,
Thread_int, NULL, 0, NULL);
Array_Of_Thread[0] = thd_main;
Array_Of_Thread[1] = thd_int;
WaitForMultipleObjects( 3, Array_Of_Thread_Handles, TRUE, INFINITE);
closehandle(thd_main);
closehandle(thd_int);
return 0;
}
答案 0 :(得分:0)
你不应该使用Suspend / ResumeThread来进行线程同步! 主要是这些功能用于调试目的。请参阅MSDN文档
请参阅SuspendThread的文档:
此功能主要供调试器使用但不是 旨在用于线程同步。
主要问题是你永远不知道你是否阻止线程。也许它只是使用被这个线程锁定的资源。比你可能会遇到僵局。特别是在线程启动阶段和使用CRT对象可能会导致此类死锁问题。但即使您使用同步对象,也可能会失败。