iocp中工作线程这一个概念, 我翻看了不少资料,还有一些开源的iocp类,工作线程函数代码,都是同一个线程函数!!!
我很奇怪,为什么工作线程的代码是一样的?比如:我已经有个需求,服务器需要开辟3个工作线程,一个应付文字传输,一个应付udp语音,
一个应付文件传输。  自然  3个线程的代码是不一样的。 
而不少开源的iocp类,作者在封装的时候,他们的工作线程函数代码都是一致的。然后留几个虚函数或者回调函数,让调用者自己实现。
我提供一个例子,这是王艳萍的书上的一个例子,叫CIOCPServer(网上也广泛流传着CIOCPServer)////////////////////////////////////////////////////////////////////////////////////
代码的大概思路: 注意HandleIO 和那几个虚函数  ,HandleIO是由线程函数_WorkerThreadPorc调用!!!!而虚函数则是被HandleIO调用!!!
class CIOCPServer   // 处理线程
{
public:
.....................
protected:
........................................
void HandleIO(DWORD dwKey, CIOCPBuffer *pBuffer, DWORD dwTrans, int nError); //回调
// 事件通知函数
// 建立了一个新的连接
virtual void OnConnectionEstablished(CIOCPContext *pContext, CIOCPBuffer *pBuffer);
// 一个连接关闭
virtual void OnConnectionClosing(CIOCPContext *pContext, CIOCPBuffer *pBuffer);
// 在一个连接上发生了错误
virtual void OnConnectionError(CIOCPContext *pContext, CIOCPBuffer *pBuffer, int nError);
// 一个连接上的读操作完成
virtual void OnReadCompleted(CIOCPContext *pContext, CIOCPBuffer *pBuffer);
// 一个连接上的写操作完成
virtual void OnWriteCompleted(CIOCPContext *pContext, CIOCPBuffer *pBuffer);
private: // 线程函数
static DWORD WINAPI _ListenThreadProc(LPVOID lpParam);
static DWORD WINAPI _WorkerThreadProc(LPVOID lpParam);
};
提供一个测试代码:
class CMyServer : public CIOCPServer
{
public: void OnConnectionEstablished(CIOCPContext *pContext, CIOCPBuffer *pBuffer)
{
printf(" 接收到一个新的连接(%d): %s \n", 
GetCurrentConnection(), ::inet_ntoa(pContext->addrRemote.sin_addr)); SendText(pContext, pBuffer->buff, pBuffer->nLen);
} .......................
};这种封装,似乎和我的需求冲突啊,我需要的是 3个线程,3个线程函数,而不是一个线程函数!!!而且HandleIO他都已经写好了。  线程函数中调用HandleIO.有人或许会说,你再换一个开源的 iocp不久可以了嘛?  我却是找了不少,发现,封装者差不多都是如此封装的。那么反推,我的设计有问题了!!!!(服务器打算用iocp模型,  可以中转语音,文字, 文件,我最初是想用3个线程,3个线程函数分别实现)如何  采用这些开源iocp来,来解决我的设计呢?

解决方案 »

  1.   

    没有必要用三个线程,无论是传什么类型的数据,服务器与客户端的通信机制是一样的,不同的只是你的业务逻辑罢了,只需要在已有iocp模型的基础上添加你的业务逻辑处理代码就行了。
      

  2.   

    不明白你所说的3个工作线程是什么,如果是用来处理IOCP消息的工作线程,那么完全没有发挥IOCP的优势。IOCP就是为了可以在多个线程中快速切换,都换成了一个还有什么意义。