[問題] 關於C++ Thread 的 Queue

看板C_and_CPP (C/C++)作者時間15年前 (2011/03/07 03:43), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++的MFC 問題(Question): 我在C++裡面使用Thread 結果出現了以下的問題 Thread1 { 收到data while (1) 將收到的資料push queue } Thread2 { while (1) pop queue } 兩個thread使用同一個queue 可是一直錯誤! 錯誤訊息是 dbgdel line52 我去查詢了一下 發現這個是重複刪除的錯誤 這個要怎麼解決呢 囧 詳細的原始碼如下 void packet_receiveing_process( char *ip_addr, int port, enum LINK_TYPE link_type, enum TRAFFIC_TYPE traffic_type, int SFID ) { WSADATA wsd; SOCKET skt; SOCKADDR_IN addr; int addr_len; struct receiving_parameter* pass_parameter = NULL; DWORD threadID_rcv; DWORD threadID_sdu; WSAStartup(MAKEWORD(2,2), &wsd); //check if it is UDP or TCP if ( link_type == LINK_TYPE_TCP ) { } else if ( link_type == LINK_TYPE_UDP ) { skt = ::socket(AF_INET, SOCK_DGRAM, 0 ); } else { fprintf ( stderr, "No such type error\n"); system("PAUSE"); return; } if ( skt == INVALID_SOCKET ) { fprintf ( stderr, "Cannot create socket for transmission\n"); } //set the address information addr.sin_family = AF_INET; addr.sin_addr.S_un.S_addr = inet_addr(ip_addr); addr.sin_port = htons((short)port); addr_len = sizeof ( addr ); ::bind(skt, (SOCKADDR*)& addr, sizeof (addr) ); pass_parameter = new struct receiving_parameter; pass_parameter->recv_ip = ip_addr; pass_parameter->recv_port = port; pass_parameter->skt = skt; pass_parameter->traffic_t = traffic_type; pass_parameter->link_t = link_type; pass_parameter->SFID = SFID; //temporary take the SFID and the CID as the same pass_parameter->CID = SFID; //create thread for receiving data CreateThread(NULL, 0, receiving_data_to_buffer, (LPVOID)pass_parameter, 0, &threadID_rcv); //create thread for constructing SDU if ( ip_packet_queue.size() > 0 ) CreateThread(NULL, 0, construct_sdu_process, 0, 0, &threadID_sdu); } //receiving thread DWORD WINAPI receiving_data_to_buffer(LPVOID lpParam) { /* Declarations */ struct receiving_parameter* passed_parameter = (struct receiving_parameter*)lpParam; char ip_address[20]; int port; char buffer[2000]; int nBytes; SOCKADDR_IN addr; int addr_len; struct IP_LAYER_PACKET received_packet; DWORD dwWaitResult; /* Code Segment */ strcpy(buffer, passed_parameter->recv_ip); port = passed_parameter->recv_port; addr_len = sizeof (addr); while ( 1 ) { nBytes = ::recvfrom(passed_parameter->skt, received_packet.data_buffer, 2000, 0, (sockaddr*)&addr, &addr_len); if ( nBytes >= 0 ) { //printf("a\n"); //Using Mutex before written hMutex = CreateMutex(NULL, FALSE, NULL); dwWaitResult = WaitForSingleObject( hMutex, INFINITE ); //printf("b\n"); received_packet.packet_size = nBytes; received_packet.SFID = passed_parameter->SFID; received_packet.CID = passed_parameter->CID; //printf("c\n"); ip_packet_queue.push_back(received_packet); //printf("d\n"); if ( dwWaitResult == WAIT_OBJECT_0 ) { ReleaseMutex(hMutex); //printf("e\n"); } //printf("f\n"); } } return 0; } DWORD WINAPI construct_sdu_process(LPVOID lpParam) { struct IP_LAYER_PACKET ip_packet; while ( 1 ) { if ( !ip_packet_queue.empty() ) { ip_packet = ip_packet_queue.front(); //ip_packet_queue.pop_front(); } } return 0; } 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.231.69.117

03/07 06:42, , 1F
置底文在你身後, 它非常火
03/07 06:42, 1F

03/07 12:42, , 2F
這code很難看,能不能轉成置底文所推薦的網站?
03/07 12:42, 2F
文章代碼(AID): #1DS-FwvH (C_and_CPP)
文章代碼(AID): #1DS-FwvH (C_and_CPP)