2016-04-15 121 views
-3

我想通過全局變量在兩個同時運行的線程 之間進行通信。如果else語句不起作用

char dir='w'; //global var 


UINT EditDir (LPVOID pParam);//accepts dir from user in a loop 
UINT Move (LPVOID pParam); //processes dir (its incomplete) 

int main() 
{ 
    ........ 
    ........ 
    CWinThread* pThread1 = AfxBeginThread(EditDir,(LPVOID)NULL); 
    CWinThread* pThread2 = AfxBeginThread(Move,(LPVOID)NULL); 
    WaitForSingleObject(pThread1, INFINITE); 
    ........ 
    ........ 
} 

UINT EditDir(LPVOID pParam) 
{ 
    bool end=false; 
    while (!end) 
    { 
     ::dir = getchar(); 
     Sleep(10); 
     if (::dir=='q')end=true;//*************************************** 
    } 
return 0; 
} 

UINT Move (LPVOID pParam) 
{ 
    //process dir in a loop 
    return 0; 
} 

while循環的if聲明不起作用它像編譯器編譯刪除前行。

我按q循環應該結束,但持續使用時間長後。

我在哪裏錯了?

+0

@EdHeal請解釋爲什麼和在哪裏? –

+0

嘗試使用「-O0」標誌進行編譯以檢查編譯器優化是否真的是原因 – 2016-04-15 11:17:59

+0

請解釋在線程和其他線程創建的位置之間的通信是如何發生的。 –

回答

0

最後,我發現這個錯誤........

CWinThread* pThread2 = AfxBeginThread(Move,(LPVOID)NULL);// #1 
WaitForSingleObject(pThread1, INFINITE); //     #2 

pThread是一個類的對象.......不是一個手柄和

WaitForSingleObject(HANDLE hHandle,DWORD dwMilliSeconds)// needs a handle 

所以我們做線#1和#2之間是

HANDLE hThread; 
hThread=pThread->m_hThread; 
在WaitForSingleObject的(...),而不是並行線程

,並通過hThread

-1

該代碼可能會出現很多問題。

  • 編譯器可能會對其進行優化,使dir存儲在寄存器中,而不會反映到其他函數中。
  • 編譯器或處理器可能會重新排列會導致一些奇怪行爲的語句。
  • 寫入別名(將您的代碼寫入恰好在dir旁邊的其他變量,並且處理器優化寫入以使用塊,從而有效覆蓋目錄)。
  • 空氣稀薄的結果。
  • 打到保存不同值的低級(L1)高速緩存。

等等。

您需要使用線程安全的結構。至少使用std :: atomic來防止寫別名和其他一些非線程安全的編譯器優化。 您也可以添加一個互斥鎖來保護對該變量的訪問。

也許是最好的設置是如果一個線程讀取輸入的字符並按下複製到您從一個很好的測試和維護良好的圖書館中得到生產者 - 消費者隊列或通信信道。

+0

與手頭的問題無關。 – SergeyA