[問題] 關於C++ Thread 的 Queue
開發平台(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
03/07 12:42, 2F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章