ポートスキャナの[1]マルチスレッド反発


CriticalSectionがなければ、同じ値が出る機会は大きいです.

  
  
  
  
  1. #include <iostream>  
  2. #include <stdio.h>  
  3. #include <windows.h>  
  4. #include <string>  
  5.  
  6. int nShareVar = 0;  
  7.  
  8. CRITICAL_SECTION gcs;  
  9.  
  10. class HalfLock  
  11. {  
  12. public:  
  13.     HalfLock(CRITICAL_SECTION *gcs)  
  14.     {  
  15.         m_pSection = gcs;  
  16.     }  
  17.     ~HalfLock()  
  18.     {  
  19.         if(m_IsNull == FALSE)  
  20.             ::LeaveCriticalSection(m_pSection);  
  21.     }  
  22. public:  
  23.     void Lock()  
  24.     {  
  25.         ::EnterCriticalSection(m_pSection);  
  26.         m_IsNull = FALSE;  
  27.     }  
  28.     void UnLock()  
  29.     {  
  30.         if(m_IsNull == FALSE)  
  31.         {  
  32.             ::LeaveCriticalSection(m_pSection);  
  33.             m_IsNull = TRUE;  
  34.         }  
  35.     }  
  36. private:  
  37.     CRITICAL_SECTION *m_pSection;  
  38.     BOOL             m_IsNull;  
  39. };  
  40.  
  41.  
  42. DWORD   WINAPI RecvThread(LPVOID lp)  
  43. {  
  44.     int num = *(DWORD*)lp;  //   
  45.     char tempBuf[128];  
  46.     HalfLock lock(&gcs);  
  47.     while(nShareVar < 1000)  
  48.     {  
  49.         sprintf_s(tempBuf, "Thread %d :: nShareVar = %d
    "
    , num, nShareVar);  
  50.         std::cout<<tempBuf;  
  51.         //EnterCriticalSection(&gcs);  
  52.         lock.Lock();  
  53.         nShareVar++;  
  54.         lock.UnLock();  
  55.         //LeaveCriticalSection(&gcs);  
  56.     }  
  57.     return 0;  
  58. }  
  59.  
  60. int main(void)  
  61. {  
  62.     InitializeCriticalSection(&gcs);  
  63.     HANDLE  Threads[10];  
  64.     // Threads  
  65.     for(int i=0; i<10; i++)  
  66.     {  
  67.         Threads[i] = CreateThread(NULL, 0, RecvThread, &i, 0, NULL);  
  68.         Sleep(500);  
  69.     }  
  70.     WaitForMultipleObjects(10, Threads, TRUE, 50000);  
  71.     DeleteCriticalSection(&gcs);  
  72.     TerminateThread(Threads, 0);  
  73.     for(int i=0; i<10; i++)  
  74.     {  
  75.         CloseHandle(Threads[i]);  
  76.     }  
  77.     system("pause");  
  78.     return 1;