首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ queue有关问题

2012-05-05 
C++ queue问题这是客户端代码,服务器会给客户端发信息,我在接收线程中将消息存放在queue中,然后用另外的线

C++ queue问题
这是客户端代码,服务器会给客户端发信息,我在接收线程中将消息存放在queue中,然后用另外的线程处理queue的消息,现在发现有的时候数据会丢失,可是服务器的确是发送了数据,而且客户端貌似也收到了,那么是不是我在queue的使用中出现了问题,或者是我在接收数据的线程中写文件,导致消息漏接,queue是全局变量:定义为queue<char*> myque;,伪代码如下:

C/C++ code
数据接收线程    ClientSocket* cs = (ClientSocket*)lparam;    SOCKET* soc = &(cs->connSocket);    char rcvBuf[1024] = {'\0'};    int i=0;    CFile  file0("tmp.dbml",CFile::modeReadWrite|CFile::shareDenyNone|CFile::modeCreate);    AfxBeginThread(WRITETOFILEThread2,cs);    while(0 <= recv(*soc,rcvBuf, sizeof(rcvBuf), 0))    {            char *tmp = new char[1024];         memset(tmp,0x00,1024);        strncpy(tmp,rcvBuf,1024);        myque.push(tmp);        file0.Write(rcvBuf,1024);        file0.Write("**",2);        file0.Write( "\r\n",2);         memset(rcvBuf,0x00,1024);    }数据处理线程:UINT WRITETOFILEThread2(LPVOID lparam){    ClientSocket * cs = (ClientSocket *)lparam;    char rcvtm[1024]={'\0'};    while (true)    {        if (!myque.empty()&&cs->getSocketStatus()==TRUE)        {            char * tmp =myque.front();            strncpy(rcvBuf,tmp,1024);            delete tmp;            strncpy(rcvtm,rcvBuf,1024);            switch(rcvBuf[0])            {            case 1:            写文件            break;            case 2:            写文件            break;            case 3:            写文件            break;            default:            break;            }            myque.pop();        }else        {            Sleep(1);        }    }        return 0;}

请高手帮忙

[解决办法]
具体问题还没看出来。
不过recv函数有返回值,并且不一定能够一次接受到 1024字节的数据,所以必须根据返回值判断。
所以先做如下更改
C/C++ code
    ClientSocket* cs = (ClientSocket*)lparam;    SOCKET* soc = &(cs->connSocket);    char rcvBuf[1024] = {'\0'};    int i=0,len;    CFile  file0("tmp.dbml",CFile::modeReadWrite|CFile::shareDenyNone|CFile::modeCreate);    AfxBeginThread(WRITETOFILEThread2,cs);    while(0 <=(len= recv(*soc,rcvBuf, sizeof(rcvBuf), 0)))    {            char *tmp = new char[len];         memset(tmp,0x00,len);        strncpy(tmp,rcvBuf,len);        myque.push(tmp);        file0.Write(rcvBuf,len);        file0.Write("**",2);        file0.Write( "\r\n",2);         memset(rcvBuf,0x00,len);    }
[解决办法]
std::queue不是线程安全的 需要自己处理线程之间的同步与互斥
[解决办法]
线程之间交换数据的话,建议使用管道,或者是能够"序列化"传输的东西
[解决办法]
楼主出错的原因应该是没有使用线程同步。

热点排行