我正在创建一个将被其他团队/产品使用的组件。该组件允许客户端代码发出一组命令,并且在内部这些命令在工作线程上执行 - 具有线程安全队列实现,其中命令被添加到调用者(客户端)线程上的队列,并被移除/处理工人线程。
我想以“操作XYZ已完成”的形式提供我的组件对客户端代码的反馈。我可以通过回调轻松地做到这一点,但是在我的工作线程上调用回调 - 我希望它发生在调用者(客户端)线程上。 我该怎么做?
这是一个跨平台组件(Windows,Linux,OS X)。提升可用。我的默认开发编译器是MS VC ++ 2010,即它不是C ++ 11。
答案 0 :(得分:2)
安排这种类型的多线程体系结构的通常方法是让每个线程都有一个仿函数阻塞队列。
每个线程循环遍历其队列,依次执行每个仿函数。
要在另一个线程中调用函数,您只需创建一个函数并将该函数添加到该线程队列中。
要在C ++中创建仿函数,您可以使用std::function
和std::bind
,lamdbas,函数对象或函数指针。见std::function
没有标准的阻塞队列,但用信号量和互斥量(它们是std::thread
库afaik的一部分,也是pthread的一部分)编写一个很容易。 Google为"blocking queue"
答案 1 :(得分:0)
为什么不重用您设置的命令处理框架,将命令作为答案从工作线程发送回客户端?它需要将您的框架转换为更通用的消息传递框架,但也许它已经适合这个目的。
命令对象/结构应包含:
可选的发行者ID(发送命令的客户端)。
您需要将命令队列从工作线程设置回客户端。每个客户端一个队列是理想的,但如果您的命令对象/结构中嵌入了客户端ID,您应该能够使用该ID来标记答案,以便它帮助客户端从全局应答队列中过滤其消息。 您还需要在客户端添加一个函数来在空闲时检查应答队列,并处理更新UI状态的答案。许多UI框架(如果不是全部)支持这种可能性,所以它应该不是问题。另一个选择是,如果您的UI或框架支持,则将队列连接到UI事件系统。
请注意,1个写入器到1个读取器配置都有无锁队列算法,这对于各个答案队列可能很有用。
答案 2 :(得分:0)
使用concurrent_queue<std::function<void()>>
,然后在主线程上检查此队列中的功能。