gpt4 book ai didi

multithreading - IOCP多线程服务器和引用计数类

转载 作者:行者123 更新时间:2023-12-03 13:04:56 25 4
gpt4 key购买 nike

我在IOCP服务器上工作(重叠的I/O,4个线程,CreateIoCompletionPort,GetQueuedCompletionStatus,WSASend等)。我的目标是向所有连接的套接字发送单个引用计数的缓冲区。(我遵循lent Holgate从WSAsend to all connected socket in multithreaded iocp server的建议)。向所有连接的客户端发送缓冲区后,应将其删除。

这是带有要发送的缓冲区的类

class refbuf
{
private:
int m_nLength;
int m_wsk;
char *m_pnData; // buffer to send
mutable int mRefCount;

public:
...

void grab() const
{
++mRefCount;
}

void release() const
{
if(mRefCount > 0);
--mRefCount;

if(mRefCount == 0) {delete (refbuf *)this;}
}

...

char* bufadr() { return m_pnData;}


};

发送缓冲区到所有套接字
refbuf *refb = new refbuf(4);
...
EnterCriticalSection(&g_CriticalSection);
pTmp1 = g_pCtxtList; // start of linked list with sockets
while( pTmp1 )
{
pTmp2 = pTmp1->pCtxtBack;
ovl=TakeOvl(); // ovl -struct containing WSAOVERLAPPED
ovl->wsabuf.buf=refb->bufadr();// adress m_pnData from refbuf
ovl->rcb=refb; //when GQCS get notification rcb is used to decrease mRefCount
ovl->wsabuf.len=4;
refb->grab(); // mRefCount ++
WSASend(pTmp1->Socket, &(ovl->wsabuf),1,&dwSendNumBytes,0,&(ovl->Overlapped), NULL);
pTmp1 = pTmp2;
}
LeaveCriticalSection(&g_CriticalSection);

和4个线程中的1个
 GetQueuedCompletionStatus(hIOCP, &dwIoSize,(PDWORD_PTR)&lpPerSocketContext, (LPOVERLAPPED *)&lpOverlapped, INFINITE);
...
lpIOContext = (PPER_IO_CONTEXT)lpOverlapped;
lpIOContext->rcb->release(); //mRefCount --,if mRefCount reach 0, delete object

我与5个已连接的客户端进行了检查,它似乎可以正常工作。当GQCS收到所有通知后,mRefCount达到0并执行删除。

我的问题是:这种方法合适吗?如果会有例如100个或更多的客户怎么办?当一个线程可以在另一个线程仍然使用它之前删除对象时,是否可以避免这种情况?如何在此方案中实现原子引用计数?提前致谢。

最佳答案

明显的问题;为了重要...

  • 您的refbuf类不使用线程安全的引用计数操作。使用InterlockedIncrement()等。
  • 我假设TakeOvl()每次操作都会获得一个新的OVERLAPPEDWSABUF结构。
  • 您的命名可能会更好,为什么grab()而不是AddRef()TakeOvl()取自什么?这些Tmp变量是某些东西,而最不重要的是它们是“临时的”,因此以更重要的东西来命名。去阅读代码完成。
  • 关于multithreading - IOCP多线程服务器和引用计数类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20597582/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com