Il MultiThreading in C in ambiente Windows
Lun 19 Mag 2008
   





Sospendere e Riesumare il Thread

Oltre che terminare un thread è anche possibile sospenderlo e successivamente riesumarlo. Con una chiamata alla funzione SuspendThread si sospende l'esecuzione del thread, con una chiamata alla funzione ResumeThread si ripristina l'esecuzione del thread predentemente sospeso.
A ciascun thread è associato un suspend count. Ogni volta che il thread viene sospeso, tramite la funzione SuspendThread, il suspend count viene incrementato di uno, ogni volta che un thread viene riesumato, tramite la funzione ResumeThread, il suspend count viene decrementato di uno.
Un thread è sospeso se il suspend count è diverso da zero, non è sospeso se il suspend count è uguale a zero. Quindi un thread potrà essere effettivamente riesumato solo quando il suo suspend count sarà uguale a zero.  

thread5.c
  1. #include <windows.h>
  2.  
  3. HANDLE Thread1, Thread2;
  4. DWORD dwThrdId;
  5.  
  6. DWORD WINAPI Thread_Method_1(LPVOID param)
  7. {
  8. int i = 0;
  9.  
  10. while (i <= 10)
  11. {
  12. printf("Thread Numero 1\n");
  13. i+=1;
  14. sleep(1);
  15. }
  16.  
  17. printf("Thread Numero 1--> Finito\n");
  18. }
  19.  
  20. DWORD WINAPI Thread_Method_2(LPVOID param)
  21. {
  22. int i = 0;
  23.  
  24. while (i <= 10)
  25. {
  26. printf("Thread Numero 2\n");
  27. i+=1;
  28. sleep(1);
  29. }
  30.  
  31. printf("Thread Numero 2--> Finito\n");
  32. }
  33.  
  34. int main(int argc, char* argv[])
  35. {
  36.  
  37. Thread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_1, 0,
  38. 0, &dwThrdId);
  39.  
  40. sleep(2);
  41. printf("Thread numero 1 Sospeso\n");
  42. SuspendThread(Thread1);
  43.  
  44. Thread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_2, 0,
  45. 0, &dwThrdId);
  46.  
  47. sleep(10);
  48. printf("Thread numero 1 Riesumato\n");
  49. ResumeThread(Thread1);
  50.  
  51. system("pause");
  52. return 0;
  53. }

In questo esempio viene creato il thread 1, dopo qualche istante il thread viene sospeso e subito dopo viene creato il thread 2, quindi dopo qualche istante viene riesumato il thread 1.

Figura 7.
È possibile sospendere, e riesumare, il thread non solo dall'interno del thread del main ma anche dall'interno degli altri thread.

thread5_1.c
  1. #include <windows.h>
  2.  
  3. HANDLE Thread1, Thread2;
  4. DWORD dwThrdId;
  5.  
  6. DWORD WINAPI Thread_Method_1(LPVOID param)
  7. {
  8. int i = 0;
  9.  
  10. while (i <= 10)
  11. {
  12. printf("Thread Numero 1\n");
  13. i+=1;
  14. sleep(1);
  15. }
  16.  
  17. printf("Thread Numero 1--> Finito\n");
  18. }
  19.  
  20. DWORD WINAPI Thread_Method_2(LPVOID param)
  21. {
  22. int i = 0;
  23.  
  24. while (i <= 10)
  25. {
  26. printf("Thread Numero 2\n");
  27. i+=1;
  28. if (i == 2)
  29. {
  30. SuspendThread(Thread1);
  31. printf("Thread numero 1 Sospeso\n");
  32. }
  33. if (i == 9)
  34. {
  35. ResumeThread(Thread1);
  36. printf("Thread numero 1 Riesumato\n");
  37. }
  38. sleep(1);
  39. }
  40.  
  41. printf("Thread Numero 2--> Finito\n");
  42. }
  43.  
  44. int main(int argc, char* argv[])
  45. {
  46.  
  47. Thread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_1, 0,
  48. 0, &dwThrdId);
  49.  
  50. Thread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_2, 0,
  51. 0, &dwThrdId);
  52.  
  53. system("pause");
  54. return 0;
  55. }

In questo esempio il primo thread viene prima sospeso e poi riesumato dall'interno del secondo thread.

Figura 8.
È anche possibile sospendere il thread dall'interno del thread stesso e poi riesumarlo dall'interno di un altro thread.

thread5_2.c
  1. #include <windows.h>
  2.  
  3. HANDLE Thread1, Thread2;
  4. DWORD dwThrdId;
  5.  
  6. DWORD WINAPI Thread_Method_1(LPVOID param)
  7. {
  8. int i = 0;
  9.  
  10. while (i <= 10)
  11. {
  12. printf("Thread Numero 1\n");
  13. i+=1;
  14. if (i == 4)
  15. {
  16. printf("Thread numero 1 Sospeso\n");
  17. SuspendThread(Thread1);
  18. }
  19. sleep(1);
  20. }
  21.  
  22. printf("Thread Numero 1--> Finito\n");
  23. }
  24.  
  25. DWORD WINAPI Thread_Method_2(LPVOID param)
  26. {
  27. int i = 0;
  28.  
  29. while (i <= 10)
  30. {
  31. printf("Thread Numero 2\n");
  32. i+=1;
  33. if (i == 9)
  34. {
  35. ResumeThread(Thread1);
  36. printf("Thread numero 1 Riesumato\n");
  37. }
  38. sleep(1);
  39. }
  40.  
  41. printf("Thread Numero 2--> Finito\n");
  42. }
  43.  
  44. int main(int argc, char* argv[])
  45. {
  46.  
  47. Thread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_1, 0,
  48. 0, &dwThrdId);
  49.  
  50. Thread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Method_2, 0,
  51. 0, &dwThrdId);
  52.  
  53. system("pause");
  54. return 0;
  55. }

In questo esempio il primo thread viene sospeso dall'interno del primo thread stesso e poi riesumato successivamente dall'interno del secondo thread.

Figura 9.


La funzione SuspendThread sospende il thread specificato dall'handle hThread

  1. DWORD WINAPI SuspendThread(
  2. __in HANDLE hThread
  3. );

Se la funzione ha successo restituisce il suspend count del thread, se non ha successo restituisce -1.


La funzione ResumeThread ripristina il thread precedentemente sospeso specificato dall'handle hThread.

  1. DWORD WINAPI ResumeThread(
  2. __in HANDLE hThread
  3. );

Se la funzione ha successo restituisce il suspend count del thread, se non ha successo restituisce -1.
Pagina 3 di 3
Prec 1 2 3 Succ