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

2024-01-03

我在 IOCP 服务器上工作(重叠 I/O、4 线程、CreateIoCompletionPort、GetQueuedCompletionStatus、WSASend 等)。我的目标是向所有连接的套接字发送单个引用计数缓冲区。(我遵循了 Len Holgate 在这篇文章中的建议WSAsend 到多线程 iocp 服务器中所有已连接的套接字 https://stackoverflow.com/questions/19760522/wsasend-to-all-connected-socket-in-multithreaded-iocp-sever)。将缓冲区发送到所有连接的客户端后,应将其删除。

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

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收到所有通知时,RefCount达到0并执行删除。

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


明显的问题;按重要性顺序...

  1. 您的 refbuf 类不使用线程安全的引用计数操作。使用InterlockedIncrement() etc.
  2. 我假设TakeOvl()获得一个新的OVERLAPPED and WSABUF每个操作的结构。
  3. 你的命名可能会更好,为什么grab()而不是AddRef(), 什么是TakeOvl()取自?这些 Tmp 变量是一些东西,最不重要的是它们是“临时的”,所以用更重要的东西来命名它们。去阅读完整代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IOCP多线程服务器和引用计数类 的相关文章

  • 是否值得清理 Filter 中的 ThreadLocals 来解决线程池相关问题?

    简而言之 tomcat 使用线程池 因此线程被重用 一些图书馆使用ThreadLocal变量 但不要清理它们 使用 remove 所以实际上它们将 脏 线程返回到池中 Tomcat 具有在关闭时检测这些事情并清理线程局部变量的新功能 但这意
  • JMeter:tearDown Thread Group的目的是什么

    我想了解JMeter中tearDown Thread Group的实际用法 在什么场景下可以使用tearDown Thread Group 根据提供的帮助JMeter 拆解线程组 http jmeter apache org userman
  • 使用来自不同线程的实时数据更新 QTableView 的最佳策略

    我的应用程序现在启动几个线程 如 5 10 个 来从不同源收集数据 它们与主 GUI 线程分离 因此我在 GUI 中感觉不到任何缓慢 并且我可以在后台线程工作时继续工作 一切都很棒 但现在我希望能够在我的主 GUI 中的 QTableVie
  • Socket.*Async 方法是线程化的吗?

    我目前正在尝试找出最小化 TCP 主服务器中使用的线程数量的最佳方法 以便最大限度地提高性能 由于我最近阅读了大量 C 5 0 的新异步功能 异步并不一定意味着多线程 这可能意味着将有限状态对象分成较小的块 然后通过交替与其他操作一起进行处
  • C# 系统 CPU 使用情况并与 Windows 任务管理器同步

    这是一个由两部分组成的问题 我想将我的代码发布到堆栈上以帮助其他人完成相同的任务 问题一 我有一个代码子集 我相信它可以根据测量间隔正确测量 CPU 使用情况 根据检索的时间跨系统中的尽可能多的核心 我在线程调用中使用 1 秒 我必须从网上
  • C++ 在循环中创建线程时出错

    我在 Visual Studio 2015 中运行以下命令时遇到问题 include
  • 摆脱潜在的僵局

    我遇到了看似僵局 死锁听起来是不是有点像 无法关闭窗口 如果 IDE 上没有终止按钮 则无法终止 空白 什么也没有发生 没有任何异常或错误 如果这些是在僵局中发生的事情 那么我可能已经解决了一半的问题 我知道有两个线程正在运行 AWT Ev
  • 块执行后变量返回 null

    我正在调度一个队列来在单独的线程上下载一些 flickr 照片 在 viewWillAppear 中 当我记录块内数组的内容时 它完美地显示了所有内容 dispatch queue t photoDowonload dispatch que
  • 基于多线程的 RabbitMQ 消费者

    我们有一个 Windows 服务 它监听单个 RabbitMQ 队列并处理消息 我们希望扩展相同的 Windows 服务 以便它可以监听 RabbitMQ 的多个队列并处理消息 不确定使用多线程是否可以实现这一点 因为每个线程都必须侦听 阻
  • Python time.sleep - 永不醒来

    我认为这将是那些简单的问题之一 但它让我感到困惑 停止媒体 我是对的 找到了解决方案 查看答案 我正在使用 Python 的单元测试框架来测试多线程应用程序 很好而且很直接 我有 5 个左右的工作线程监视一个公共队列 以及一个为它们制作工作
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • static_cast 和对指针的引用

    谁能告诉我为什么这不能编译 struct A struct B public A int main B b A a b B b1 static cast
  • 如何从不同的线程访问控件?

    如何从创建控件的线程以外的线程访问控件 避免跨线程错误 这是我的示例代码 private void Form1 Load object sender EventArgs e Thread t new Thread foo t Start p
  • 重构——套接字中的良好实践——简单的服务器-客户端 Swing 应用程序

    我使用单例和观察者模式编写了一个带有 Swing 接口的简单服务器 客户端程序 每个客户端都连接到服务器并可以发送消息 服务器将其收到的消息转发给其余的客户端 客户端使用 GUI 允许它们随时连接和断开与服务器的连接 该程序运行得很好 因为
  • 为什么一个线程会中断另一个线程[重复]

    这个问题在这里已经有答案了 在Java多线程应用程序中 我们处理InterruptedThreadException 如果另一个线程中断当前线程 则会抛出此异常 现在 当另一个线程知道它将导致异常时 它可能想要中断当前线程的原因是什么 很多
  • 将 POST 从请求转换为 GAE urlfetch

    我正在使用 PayPal 付款 这是它如何正确工作的requests res requests post get payment info url headers headers data params res data res json
  • 如何在.NET 中编写安全/正确的多线程代码?

    今天我必须修复一些使用线程的旧 VB NET 1 0 代码 问题在于从工作线程而不是 UI 线程更新 UI 元素 我花了一些时间才发现可以使用 InvokeRequired 断言来查找问题 除了上面提到的并发修改问题之外 还可能遇到死锁 竞
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 为什么在读取字典时要锁定

    我对我正在阅读的一本关于线程的书 C 3 in a Nutshell 中的代码列表感到困惑 在 应用程序服务器中的线程安全 主题中 给出了以下代码作为 UserCache 的示例 static class UserCache static
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐