【问题标题】:Multiple I/O Completion Ports多个 I/O 完成端口
【发布时间】:2014-03-14 21:48:35
【问题描述】:

我可以在单个应用程序中创建多个 I/O 完成端口吗?我的意思是,用自己的 CompletionKey 持有两个或更多 CreateIoCompletionPort 句柄?我的应用程序有 2 个 IOCP 类,它们具有从索引 0 开始的自己的客户端结构。我在 CompletionKey 中使用这些索引,所以我相信在某些时候这会导致冲突,因为我的应用程序会在没有任何逻辑原因的情况下导致死锁。三次检查任何死锁情况并在调试模式下运行无济于事!

【问题讨论】:

    标签: class iocp


    【解决方案1】:

    是的。您可以创建任意数量的 IOCP*。

    我希望您的代码中存在错误或标准的“锁反转导致的死锁”。

    当应用程序死锁时,您能否在调试器中闯入应用程序并查看线程在做什么?

    (* 受限于通常的资源限制、内存等)。

    【讨论】:

    • 谢谢。我在您的网站上阅读了有关锁反转的信息,我很确定就是这样。现在我有另一个问题......我不知道如何修复代码,因为我需要这些锁。在我的应用程序中,我有 2 个 IOCP,它们有自己的客户端结构,每个客户端关键部分。一些线程在 IOCP 1 上锁定,然后在 IOCP 2 上锁定,而其他线程在 IOCP 2 上然后在 IOCP 1 上锁定(有时会导致锁反转)。我该如何处理?
    • 假设您在这里有某种网关/代理情况,您有两个连接在一起的连接,那么解决方案是拥有一个具有自己锁定的“链接数据”。然后,通过锁定每个连接以添加链接,将连接链接到链接数据;但永远不要同时持有两个连接的锁。链接后,您只能使用链接来访问连接,并且只有在使用两个连接时才能保持链接的锁定。
    • 我有一个在线游戏的反黑客系统。客户端和游戏服务器连接到我的应用程序。一个 IOCP 是公共的(客户端),另一个是私有的(游戏服务器)。问题是我有时需要锁定两个数据结构,并且不可能只有一个链接数据......
    • 没有必要有两个 IOCP。您可以将任意数量的侦听套接字与单个 IOCP 关联,并将所有连接关联到同一个 IOCP。在每个连接数据中使用标志或其他内容来区分正在侦听的两个“端点”(客户端和游戏)。请注意,这仍然需要您链接两个连接。
    • 在有两个锁的情况下避免死锁的另一种方法是始终按内存地址顺序锁定锁。这意味着您将始终以相同的顺序锁定锁,并且您不会获得锁反转。
    猜你喜欢
    • 2011-02-17
    • 2013-01-04
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多