【问题标题】:How do I implement thread affinity in c++如何在 C++ 中实现线程亲和性
【发布时间】:2019-02-18 15:19:51
【问题描述】:

我正在使用需要线程亲和性的第三方 API,即第三方 API 返回一个句柄,使用该句柄的任何后续第三方 API 调用都必须在同一线程上执行。在标准 C++11 中实现这一点的最佳方法是什么(不使用其他 3rd 方库,例如 boost 等)?

理想情况下,我希望能够传入表单的闭包

[&] { return api_function(_handle, parameters); }

尽可能创建句柄的线程。

我最初的想法是创建一个 std::thread 来执行添加到 std::queue 的任务。这是最好的解决方案吗?

【问题讨论】:

  • 线程亲和性不是标准库的线程功能所识别的。
  • 你描述的不是我理解的“线程亲和力”。听起来您需要能够运行特定线程并根据需要向每个线程调度指令(和数据)。老实说,这对于SO 来说听起来有点宽泛。
  • @FrançoisAndrieux 你是在暗示它不能完成吗?似乎创建一个在(同步)队列的内容(<:function> 类型)上循环的工作线程,然后对其内容进行操作似乎是可行的。
  • @Galik 是的,似乎对此感到困惑,我称之为处理器亲和力,即将线程或进程固定到特定核心。这就是您认为的线程亲和性吗?
  • 听起来您只需要注意不要从其他任何地方调用该库的代码,因此第一步是 /not/ 打破规则。第二步是实现该线程服务的任务队列,并且可以在任何地方使用该队列来使用该库执行代码。查看std::function 来完成任务,剩下的就是工作和/或在标准库或其他地方找到合适的工具。

标签: c++ multithreading design-patterns


【解决方案1】:

任何使用该句柄的后续第三方 API 调用都必须在 完全相同的线程

这不是affinity (in the context of processing)——它是线程或整个进程与特定 CPU/内核的绑定。您需要确保没有其他线程运行您的任务 -- 无论线程在哪个处理单元上运行,或者它是否继续在同一单元上运行或切换到另一个。

我最初的想法是创建一个执行任务的 std::thread 添加到 std::queue 中。这是最好的解决方案吗?

嗯,这绝对适合你。您将从任何线程推送任务到,比如说std::queue&lt;std::function&lt;RetValType()&gt;&gt;(只要确保同步访问),然后从允许这样做的单个线程一次调用pop()。

这符合您推送这些表达式的要求:

[&] { return api_function(_handle, parameters); }

进入队列。

【讨论】:

  • 我编辑了您的答案以删除我认为模棱两可的第一段,以便我可以将其标记为答案。 Wikipedia 将处理器亲和性定义为您所说的线程亲和性,这就是我一直理解的方式。
  • 亲爱的@markf78,我想我明白你在解释处理器亲和力时提到进程和处理器时可能造成混淆的观点。我确实认为由于您的问题而做出的部分贡献正是 affinty 的含义与您在问题中的含义之间的区别,因为我确信您不是唯一的一。由于这个网站的想法是为未来的读者澄清这些问题,我留下了简短的段落——但希望感谢你使解释更清楚。如果您仍然觉得它有问题,请告诉我。
猜你喜欢
  • 2017-12-06
  • 1970-01-01
  • 2011-01-15
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多