2017-07-18 7 views
0

Je suis en train de développer un simulateur de matériel informatique intégré par Visual Studio 2010 avec WINAPI. J'ai rencontré le problème quand j'ai essayé d'émuler l'interruption ... Le comportement d'interruption agit comme suit ... pendant qu'un threadA fonctionne et pendant ce temps il y a une interruption, ainsi le threadA sera maintenu et sautera pour exécuter la fonction ISR, après la fonction ISR a été fait, threadA peut reprendre et continuer à travailler ...MSDN simule le comportement d'interruption

J'ai essayé de simuler cette action par multithread donc il y a un fil appelé interruption thread, qui suspend threadA et faire la Opération ISR, puis reprendre threadA, tout comme le code ci-dessous ...

mais le problème est que ma morue e sera bloqué lors de l'appel de sespendthread() le printf ("a") précédent peut être vu, mais le printf ("b") ne peut pas ...

Existe-t-il d'autres façons de simuler une interruption avec MSDN? je considérais sur l'utilisation singals et SignalHandler pour résoudre cette question, mais il semble que le signal Windows ne peut pas être envoyé à la discussion spécifique, ne peut être envoyé à une procédure spécifique ...

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; 
} 

Répondre

0

Vous ne devriez pas utiliser Suspend/ResumeThread pour faire la synchronisation des threads! Principalement, ces fonctions sont présentes à des fins de débogage. Voir la documentation MSDN

Voir la documentation pour SuspendThread:

Cette fonction est principalement conçue pour être utilisée par les débogueurs Il ne destiné à être utilisé pour la synchronisation des threads.

Le problème principal est que vous ne savez jamais si vous bloquez un thread. Peut-être qu'il utilise simplement des ressources qui sont verrouillées par ce fil. Que vous pouvez avoir des blocages. Spécialement dans la phase de démarrage du thread et l'utilisation d'objets CRT peut causer de tels problèmes d'interblocage. Mais même si vous utilisez vos objets de synchronisation, vous risquez d'échouer.