C++ queue问题
这是客户端代码,服务器会给客户端发信息,我在接收线程中将消息存放在queue中,然后用另外的线程处理queue的消息,现在发现有的时候数据会丢失,可是服务器的确是发送了数据,而且客户端貌似也收到了,那么是不是我在queue的使用中出现了问题,或者是我在接收数据的线程中写文件,导致消息漏接,queue是全局变量:定义为queue<char*> myque;,伪代码如下:
数据接收线程 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;}
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不是线程安全的 需要自己处理线程之间的同步与互斥
[解决办法]
线程之间交换数据的话,建议使用管道,或者是能够"序列化"传输的东西
[解决办法]
楼主出错的原因应该是没有使用线程同步。