【问题标题】:How do two or more std::threads operate on the same function?两个或多个 std::threads 如何在同一个函数上运行?
【发布时间】:2015-08-10 08:20:51
【问题描述】:

我正在开发一个 C++ 程序,在该程序中我正在处理几对数据(数组和矩阵)。由于时间要求,我需要并行处理相应的对,并且我计划为此目的使用 std::threads 。由于他们将调用相同的函数,我需要确保他们永远不会混淆彼此的操作。

我想知道每个线程是否创建自己的调用堆栈,并且不同线程调用的同一个函数的局部函数变量对于调用者来说是唯一的。

此外,所有线程都需要写入同一输出数组的不同部分。即使它们没有写入数组的同一部分,也会导致问题吗?

【问题讨论】:

  • 每个线程都是独立的,并且会有自己的堆栈。除非它们使用全局变量或其他共享数据,否则它们不会相互影响
  • 我会使用 openmp 来实现这一点..
  • 感谢您的 cmets。我还考虑使用 openmp,因为它是一种基本的并行化,据我所知,使用 c++ 线程会增加一点时间开销。

标签: c++ multithreading stdthread


【解决方案1】:

你很好。

每个线程都有自己的堆栈,当两个线程写入或读取不同的内存位置时,没有竞争条件。

在您的情况下,潜在的陷阱是:

  • 您的函数写入全局变量。
  • 您的函数通过引用获取参数并对其进行变异。
  • 输出数组中有一些位置可以被两个线程访问。

顺便说一句,如果并行化如此简单,那么看看 OpenMP 或类似的东西会让这种并行化相当简单。

【讨论】:

  • 可以判断 openmp 或 c++ 线程是否更省时,因为我正在努力改善执行时间。
  • 我没有经常使用 OpenMP,但我听说它非常有效。根据问题的特征,特别是函数的成本,您可能需要在自己的基于 std::thread 的代码中投入一些工作,以匹配(或优于)OpenMP 以解决您的特定问题。而且我认为在您的情况下不使用它并没有什么好处。
  • 我尝试了 std::thread 和 OpenMP 进行并行化,在大多数情况下,它们的执行性能并驾齐驱,而 OpenMP 稍好一些。对于线程以全性能运行的特定情况(系统监视器显示所有内核的 CPU 使用率为 100%)std::thread 远远落后于 OpenMP,出于某种我无法弄清楚的原因。 OpenMP 比 C++ 线程更适合我的需求。
  • @AliKavis 原因可能是您创建了太多线程,但同样,OpenMP 更简单。如果您看不到使用 std::thread 的理由,请坚持使用 OpenMP。
猜你喜欢
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多