一个IOCP莫名崩溃的问题,求高手指教
服务线程和通信函数如下。
现在的问题是,并发量大的时候会崩溃,简单的10/100个没问题。我自己写了测试工具,12k个线程同时和server端通信,有时候会崩溃,崩溃的详细情况见ProcessClientIO函数。我试验过几次,有时候12k线程也正常。
求教高手指教,哪里有问题
这个是服务线程
DWORD WINAPI ServiceThread( void *pParam )
{
CMyService *pService = (CMyService*)pParam;//主窗口指针
HANDLE hComPort = pService->m_hCompPort;//完成端口
CClientSocketContext * pClient;
DWORD dwIoSize; //传输字节数
LPOVERLAPPED lpOverlapped; //重叠结构指针
BOOL bFlagExit = FALSE; //服务线程退出
BOOL bIORet;
CClientListManager * pClientMgr;
pClientMgr=CClientListManager::GetClientListManager();
pService->DebugMsg("pClientMgr %lx In ServiceThread ",pClientMgr);
while (!bFlagExit)
{
dwIoSize = -1;
lpOverlapped = NULL;
pClient = NULL;
//等待I/O操作结果
bIORet = GetQueuedCompletionStatus(hComPort,
&dwIoSize,
(LPDWORD) &pClient,
&lpOverlapped,
INFINITE);
if (FALSE == bIORet )
{
pService->DebugMsg("CardService: failed overlapped operation occurs. maybe client timeout");
}
//成功的操作完成
if(bIORet && lpOverlapped && pClient)
{
pService->DebugMsg("CardService: normal overlapped occurs,lpOverlapped %lx,pClient %lx",lpOverlapped,pClient);
pClientMgr->ProcessClientIO(pClient, lpOverlapped, dwIoSize);
}
//服务器退出
if(!pService->m_bTcpipServerRunning)
{
pService->DebugMsg("CardService: exit.(m_bTcpipServerRunning FALSE)");
bFlagExit = TRUE;
}
}
return 0;
}这个是处理IO数据函数,崩溃的时候是在这里
void CClientListManager::ProcessClientIO( CClientSocketContext* pClient,
LPOVERLAPPED pOverlapped,
DWORD dwIOSize)
{
if (0==dwIOSize)
{
//close client
DeleteClient(pClient);
return;
}
//崩溃的时候,从一次调试可以看到,这里dwIOSize的值是正确的。pOverlapped、pClient、pIO的值都是非法的,所以下面进行判断的时候崩溃了。奇怪的是这里pOverlapped和pClient都是GetQueuedCompletionStatus获得的
PIO_OPERATION_DATA pIO = CONTAINING_RECORD(pOverlapped, IO_OPERATION_DATA,overlapped
if (pIO->type==OP_WRITE)
{
pClient->AsyncRecvData();
//具体其他操作
}
else if (pIO->type==OP_READ)
{
//其他操作
}
}读写操作
BOOL CClientSocketContext::AsyncRecvData( void )
{
DWORD flags = 0; //标志
DWORD recvBytes =0; //发送字节数
ZeroMemory(&m_iIO, sizeof(m_iIO));
m_iIO.type = OP_READ;//操作类型
WSABUF wsaBuf;
wsaBuf.buf = (char*)&m_iIO.recvBuf; //
wsaBuf.len = sizeof(m_iIO.recvBuf);
time(&m_tLastTimeValue);
//读取数据
if (WSARecv(m_socket,
&wsaBuf,
1,
&recvBytes,
&flags,
&m_iIO.overlapped,
NULL) == SOCKET_ERROR)
{
if(ERROR_IO_PENDING != WSAGetLastError())
{
return FALSE;
}
}
return TRUE;
}
BOOL CClientSocketContext::AsyncSendData( void )
{
DWORD flags = 0; //标志
DWORD sendBytes =0; //发送字节数
m_oIO.type = OP_WRITE; //操作类型
WSABUF wsaBuf;
wsaBuf.buf = (char*)&(m_oIO.recvBuf); //
wsaBuf.len = m_oIO.ulDataLen;
time(&m_tLastTimeValue);
//发送数据
if (WSASend(m_socket,
&wsaBuf,
1,
&sendBytes,
flags,
&m_oIO.overlapped,
NULL) == SOCKET_ERROR)
{
if(ERROR_IO_PENDING != WSAGetLastError())//成功发起重叠操作
{
return FALSE;
}
}
return TRUE;
}相关推荐
90%人忽略的C#串口通信致命缺陷:DataReceived事件线程安全全解析(工业级解决方案+完整源码)
本质不是「串口难用」,而是开发者对「线程安全」的认知缺失C#是一门「入门容易,精通难」的语言,它屏蔽了底层的线程细节,让开发者可以快速写出功能代码,但也让开发者忽略了「多线程」这个核心知识点。而SerialPort的DataReceived事件,恰恰是C#中最典型的多线程场景,它把「线程安全」的问题赤裸裸地摆在开发者面前,认知不足,必然踩坑。串口数据是字节流,DataReceived是后台线程,采集只做读数据,处理用队列解耦,UI更新用BeginInvoke,所有串口操作必加锁,7×24小时稳如狗。
VC++多线程聊天室实战:WinSock网络编程与线程同步详解
网络编程是构建分布式系统的核心技术,其核心在于实现不同主机间的进程通信。TCP/IP协议栈提供了可靠的字节流传输服务,而Socket API则是操作系统提供的网络编程接口,开发者通过调用Socket函数创建连接、发送和接收数据。在Windows平台下,WinSock API是实现网络通信的基础,理解其阻塞与非阻塞模式、select模型等概念对掌握高性能服务器开发至关重要。多线程技术能够有效提升程序的并发处理能力,通过为每个客户端连接创建独立线程,可以实现同时服务多个用户的需求。然而,多线程环境下共享资源的访
C++编程精髓:从核心语法到性能优化的现代工程实践指南
在计算机编程领域,内存管理和性能优化是构建高效系统的核心基础。理解内存分配、缓存机制和多线程同步等底层原理,对于开发操作系统、游戏引擎和高频交易系统等高性能应用至关重要。C++语言以其对硬件的直接控制能力和零开销抽象原则,成为实现极致性能的首选工具。通过智能指针、移动语义和RAII等现代特性,开发者可以编写更安全、高效的代码,同时利用模板元编程和编译期优化进一步提升执行效率。这些技术广泛应用于需要精细控制资源的场景,如并发网络服务器和实时数据处理系统,体现了C++在工程实践中的独特价值。
C#异步编程深度解析:状态机、ExecutionContext与SynchronizationContext
异步编程是现代高性能.NET应用的基石,其核心在于理解任务(Task)如何抽象异步操作、await如何通过编译器生成状态机实现协程式控制流。本文从TAP模式出发,深入剖析async/await背后的三大关键技术支柱:状态机(编译器自动生成的IAsyncStateMachine)、ExecutionContext(保障安全上下文跨await传递)以及SynchronizationContext(决定代码恢复执行的线程环境)。结合ASP.NET Core高并发场景与WPF UI响应性需求,揭示Configure
.NET 8 Socket编程实战:TcpListener/TcpClient客户端服务端联调
Socket是服务器与客户端通信的核心技术,其底层依赖TCP/IP协议完成可靠的双向数据传输。在实际开发中,开发人员往往需要面对连接管理、异步并发、消息边界划分等基础问题。特别是当数据量增大时,TCP粘包与半包现象会严重影响程序稳定性,此时引入长度前缀协议便成为的一种高效解决方案。同时,利用async/await异步模型可避免线程阻塞,支撑高并发场景下的密集连接。此类技术在即时通讯、实时通知、远程控制等应用中有着广泛需求。基于.NET 8环境下的TcpListener与TcpClient类,服务端可简单实现


网络编程

