2014-05-08 30 views
0

我想讓我的主程序啓動一個線程,管理我的程序的一部分...獲取的線程創建一個數組的每個元素的子線程。子線程將數組元素設置爲不可用,延遲10秒,然後將元素設置爲可用。然而,主線程繼續正常執行,直到數組元素可用。睡眠命令不工作在子線程

但是,它似乎不適用延遲...

請注意數組是一個全球性的陣列。

我在做什麼錯?

下面的代碼將概述我想要更好,然後解釋...

DWORD WINAPI SubThread(void* lpParam) 
{ 
    int i = (int)lpParam; 

    printf("Sub Thread Ran"); 

    structureArray[i].available= false; 
    Sleep(10000); 
    structureArray[i].available = true; 
    return 0; 
} 

DWORD WINAPI MainThread(void * lpParam) 
{ 
    while(true) 
    { 
     for(int i = 0; i < structureArray.size(); i++) 
     { 
      if(structureArray[i].available) 
      { 

       CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SubThread, (LPVOID)i, 0, NULL); 
      } 
     } 
    } 
} 
+1

也許你的子線程沒有運行,因爲主線程已經終止。如果你想要預期的結果,你應該在訪問全局數組時使用互斥鎖。 – jfly

回答

0

你的全局變量不是線程安全的,它似乎。

嘗試使用一個線程安全的集合或鎖定自己的訪問(解決方案是特定的窗口,推斷從WINAPI符):

class CriticalSection 
{ 
public: 
    CriticalSection() 
     { ::InitializeCriticalSection(&m_cs); } 
    ~CriticalSection() 
     { ::DeleteCriticalSection(&m_cs); } 

    void Enter() 
     { ::EnterCriticalSection(&m_cs); } 
    void Leave() 
     { ::LeaveCriticalSection(&m_cs); } 

private: 
// private to prevent copying 
    CriticalSection(const CriticalSection&); 
    CriticalSection& operator=(const CriticalSection&); 

    CRITICAL_SECTION m_cs; 
}; 

class Lock 
{ 
public: 
    Lock(CriticalSection& a_section): m_section(a_section) 
    { m_section.Enter(); } 
    ~Lock() 
    { m_section.Leave(); } 

private: 
    Lock(const CSLock&); 
    Lock& operator=(const CSLock&); 
    CriticalSection& m_section; 
}; 

CriticalSection g_dontUseGlobalCS; 

DWORD WINAPI SubThread(void* lpParam) 
{ 
    int i = (int)lpParam; 

    printf("Sub Thread runs for..."); 

    Sleep(10000); 

    { // use scope to destroy lock... 
     Lock(g_dontUseGlobalCS); 
     structureArray[i].available= true; 
    } // exactly here 

    // note: a new thread could already be running here 
    // for debugging purposes add this: 
    printf("10 seconds."); 
    return 0; 
} 

DWORD WINAPI MainThread(void * lpParam) 
{ 
    while(true) 
    { 
     for(int i = 0; i < structureArray.size(); i++) 
     { 
        Lock(g_dontUseGlobalCS); 
      if(structureArray[i].available) 
      { 
         // set the thread availability here 
         structureArray[i].available = false; 
       CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SubThread, (LPVOID)i, 0, NULL); 
      } 
     } 
    } 
} 

我也感動了集可用性標記的創建者線程。通常你會使用其他機制來實現你正在嘗試做什麼: 調查windows synchronization functionswiki