用于两个线程之间通信的C ++多线程数据结构

时间:2010-11-04 19:04:36

标签: c++ multithreading message-queue

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

提前致谢

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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