1

我正在创建一个将被其他团队/产品使用的组件。该组件允许客户端代码发出一组命令,并且在内部这些命令在工作线程上执行 - 使用线程安全队列实现,其中命令被添加到调用者(客户端)线程上的队列中,并在工作线程。

我想以“操作 XYZ 已完成”的形式提供从我的组件到客户端代码的反馈。我可以通过回调轻松地做到这一点,但是回调是在我的工作线程上调用的——我希望它发生在调用者(客户端)线程上。我怎样才能做到这一点?

它是一个跨平台组件(Windows、Linux、OS X)。升压可用。我的默认开发编译器是 MS VC++ 2010,即它不是 C++11。

4

3 回答 3

2

安排这种类型的多线程架构的常用方法是让每个线程都有一个阻塞队列的函子。

每个线程循环其队列,依次执行每个仿函数。

要在不同的线程中调用函数,您只需创建一个仿函数并将其添加到该线程队列。

要在 C++ 中创建仿函数,您可以使用std::functionand std::bind、lamdbas、函数对象或函数指针。看std::function

没有标准的阻塞队列,但是用信号量和互斥体(它们是std::thread库 afaik 的一部分,也是 pthread 的一部分)编写一个相当容易。谷歌"blocking queue"

于 2013-01-08T05:24:28.313 回答
0

为什么不重用已设置的命令处理框架,将命令作为答案从工作线程发送回客户端?这需要将您的框架转变为更通用的消息传递框架,但也许它已经适合该目的。

命令对象/结构应包含:

  • 命令的 id(用于回复其完成状态)
  • 可选的颁发者 ID(发送命令的客户端)。

    您需要将命令队列从工作线程设置回客户端。每个客户端一个队列是理想的,但是如果您在命令对象/结构中嵌入了一个客户端 ID,您应该能够使用该 ID 来标记答案,以便帮助客户端从全局答案队列中过滤他们的消息。您还需要在客户端中添加一个函数,用于在空闲时间检查应答队列,并处理应答以更新 UI 状态。许多 UI 框架(如果不是全部)都支持这种可能性,所以这应该不是问题。如果您的 UI 或框架支持,另一种选择是将队列连接到 UI 事件系统。

请注意,对于 1 个写入器到 1 个读取器配置,有无锁队列算法,这对于单独的应答队列可能很有趣。

于 2013-01-08T12:33:40.530 回答
0

使用 a concurrent_queue<std::function<void()>>,然后在主线程上检查此队列的功能。

于 2013-01-08T13:13:16.683 回答