我在一个发送线程中send一个消息给服务器,并将该数据加入一个队列中
伪代码如下send()//发送消息EnterCriticalSection()
cmppsock.ListWaitResp.AddTail(msg);//将发送给服务器的消息加入这个队列
LeaveCriticalSection()然后在另外一个接收线程中recv
阻塞 + select模型接受recv()//接受数据EnterCriticalSection()
cmppsock.ListWaitResp.GetCount()//发现这里的队列的消息数量居然是0
LeaveCriticalSection()
跟踪发现 原来代码是刚执行完send后就到了recv这边接受了
然后接着求队列中的消息数量,当然是零。。(send后没来得及执行ListWaitResp.AddTail(msg))强烈注意(我先开了Recv线程,后开send线程)麻烦帮忙解决一下这个问题

解决方案 »

  1.   

    那接受段干脆一只等待,知道count非0就是了。while(true) {
        EnterCriticalSection()
        int count = cmppsock.ListWaitResp.AddTail(msg);//将发送给服务器的消息加入这个队列
        LeaveCriticalSection()
        if(count > 0)
            break;
        else
            Sleep(50);
    }
      

  2.   

    靠,怎么打错了那么多字。:(应该是
    那接收端干脆一直等待,直到count非0就是了。
      

  3.   


    EnterCriticalSection()
    send()//发送消息
    cmppsock.ListWaitResp.AddTail(msg);//将发送给服务器的消息加入这个队列
    LeaveCriticalSection()
    EnterCriticalSection()
    recv()//接受数据
    cmppsock.ListWaitResp.GetCount()//发现这里的队列的消息数量居然是0
    LeaveCriticalSection()
      

  4.   

    修正EnterCriticalSection()
    send()//发送消息
    cmppsock.ListWaitResp.AddTail(msg);//将发送给服务器的消息加入这个队列
    LeaveCriticalSection()recv()//接受数据
    EnterCriticalSection()
    cmppsock.ListWaitResp.GetCount()//发现这里的队列的消息数量居然是0
    LeaveCriticalSection()
      

  5.   

    那不太会啊,你两端是针对同一个CriticalSection对象进行的操作么?
      

  6.   

    lz所说的情况有可能阿我觉得不如直接全部保护了 ,类似zephyr007(道可道)或者最简单的在send前入队列