MSDN模拟中断行为

时间:2017-07-18 16:00:26

标签: multithreading visual-c++ interrupt msdn

我正在尝试用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;
} 

1 个答案:

答案 0 :(得分:0)

你不应该使用Suspend / ResumeThread来进行线程同步! 主要是这些功能用于调试目的。请参阅MSDN文档

请参阅SuspendThread的文档:

  

此功能主要供调试器使用但不是   旨在用于线程同步。

主要问题是你永远不知道你是否阻止线程。也许它只是使用被这个线程锁定的资源。比你可能会遇到僵局。特别是在线程启动阶段和使用CRT对象可能会导致此类死锁问题。但即使您使用同步对象,也可能会失败。