【问题标题】:C++ multi threading data structure for communication between two threads用于两个线程之间通信的 C++ 多线程数据结构
【发布时间】:2011-05-05 06:09:09
【问题描述】:

我有一个调用 COM 接口的各种 API 的线程。现在我想从另一个线程调用这些函数。你能告诉我如何做到这一点吗? 如何实现这两个线程之间的通信?如果我定义了这两个线程通用的消息队列类型的数据结构,那么如何定义通用数据结构,因为每个 COM API 的参数都不同。

提前致谢

【问题讨论】:

  • 您需要提供更多详细信息。为什么需要消息队列? COM 调用通常是同步的。

标签: c++ multithreading message-queue


【解决方案1】:

典型的方法是使用回调。您通过指针传递数据。当您将基类从队列中弹出时,您可以使用多态性来覆盖基类调用的方法。基调用函数 x,您在派生类中覆盖函数 x 以实现您想要的。

另一种方法是使用普通的旧回调。您将函数的地址与所需的任何数据一起传递到队列中,并干净地包装在结构中。所有回调必须具有相同的签名,因此您可能需要将数据强制转换为 void。

【讨论】:

    【解决方案2】:

    您没有定义一种通用的数据结构。每个不同的函数签名都有不同的数据结构。这些结构之间唯一的共同点是函数的标识符。在您的线程中,您将拥有将函数标识符转换为函数本身的巨大开关(或 std::map)。之后,您知道如何解释结构的其余部分。结构应该具有 POD 语义。

    【讨论】:

      【解决方案3】:

      如果每个线程都作为single-threaded apartment 运行,那么您可以通过CoMarshalInterThreadInterfaceInStream 将其接口指针作为IStream 从对象拥有的线程编组到另一个线程,从而从远程线程调用所需的API 和CoGetInterfaceAndReleaseStream。一旦远程线程有了接口指针,就可以直接调用它。

      您还可以使用Global Interface Table 更简单地执行此操作,具体取决于您应用的线程模型。这将是最简单的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-18
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        相关资源
        最近更新 更多