2016-04-15 205 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