2017-07-18 77 views
0

我想用Visual Studio 2010用WINAPI开发嵌入式HW模拟器。 我试图模拟中断时遇到了问题... 中断行为的行为如下... 当threadA正在工作,同时出现中断时, 因此threadA将被保留并跳转以执行ISR功能, ISR功能已经完成后,ThreadA中可以恢复并继续工作......MSDN模拟中断行为

我试图来模拟多线程 这个动作所以被称为中断线程的线程,这将暂停的ThreadA和 做ISR操作,然后恢复threadA,就像下面的代码...

但问题是,我的鳕鱼当调用sespendthread() 可以看到前面的printf(“a”),但printf(“b”)不能...

是否有任何其他方法来模拟MSDN中断? 我认为有关使用边界处理和signalhandler来解决这个问题, 但它看起来像窗口信号不能被发送到特定的线程, 只能被发送到特定的工艺......

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

不应该使用挂起/ ResumeThread做线程同步! 这些功能主要用于调试目的。见MSDN文档

见文档SuspendThread

此功能主要由调试它不 旨在用于线程同步设计的。

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