Thread1
{
     OnMessage()
    {
       s.Lock();
       ...........
       Fun();
       .............
       s.UnLock();
    }
}Thread2
{
    PostMessage();
}
Thread2 向Thread1发送消息,Thread1执行 Fun(),如果Fun()未执行完,Thread2 又向Thread1发送消息,造成OnMessage()的重入,这样Thread1肯定回死锁。这种问题如何解决?

解决方案 »

  1.   

    这不会造成死锁。
    因为第二次s.lock()阻塞,直到第一次s.unlock()执行完为止。
      

  2.   

    关键问题是多次执行OnMessage(),是在同一线程中,相当于单线程中多次s.Lock(),这种情况就很可能死锁。
      

  3.   

    死锁主要是由于以下原因造成:
    A要得到a,b资源,现在得到了a
    B也要得到a,b资源,现在得到了b
    这样A,B就形成了死锁。另外,由于消息的处理是串行的,只有一个消息处理完以后
    才会处理另一个消息。
    所以从这点看,你的程序肯定是不会死锁的。
      

  4.   

    可以试一下
    OnTime()
    {
         MessageBox();
    }
    可以弹出无数个对话框,说明这个定时器消息似乎并不是串行的。
      

  5.   

    可以试一下
    OnTime()
    {
    MessageBox();
    }
    可以弹出无数个对话框,说明这个消息的处理不是串行的。
      

  6.   

    如果是Fun()执行的时间不一定,多次执行的总时间要小于Thread2
    发送消息的周期,就不会阻塞了。
      

  7.   

    OnTimer为直接调用处理函数,所以不是串行的。只要用PostMessage发送到消息队列,就是串行处理了。
      

  8.   

    再请问,Windows中还有哪些消息处理函数是直接调用处理?
      

  9.   

    SendMessage直接调用处理函数。
    PostMessage发到消息队列。
    windows中使用On开头的函数一般都是直接处理。
    其实这方面的你可以看一看<<深入浅出MFC>>