【问题标题】:Should pthread function arguments be allocated on the stack or the heap?pthread 函数参数应该分配在堆栈还是堆上?
【发布时间】:2019-09-16 03:57:43
【问题描述】:

我已经使用 pthreads 为生产者-消费者/有界缓冲区问题编写了一个“解决方案”,并且我使用 72 位结构来存储所有线程共享的数据和同步类型。这个结构是在堆上分配的,但在堆栈上分配它并在pthread_create 中传递它的地址也可以。在使用pthread_detach的情况下,是否有任何理由更喜欢堆栈分配而不是pthread参数的堆分配(反之亦然)?

编辑:
该结构在main() 中声明,并且所有线程都保证在main() 完成之前完成。超出范围不是问题。

【问题讨论】:

  • 我对此表示怀疑,只是在从堆栈传递参数时要小心数据范围。如果堆栈中的数据超出范围(例如,当函数退出时),并且您的线程仍在处理它.. UB
  • 鉴于您的编辑,听起来您的问题更多地与何时使用自动与动态存储分配有关。鉴于您的数据结构很小,我会使用自动的。这是关于 SO 处理该主题的几个问题之一:stackoverflow.com/questions/1963780/…
  • C11 标准草案 n1570:6.2.4 对象的存储持续时间 5 其标识符声明为没有链接且没有存储类说明符 static 的对象具有自动存储持续时间,某些化合物也是如此文字。尝试从与对象关联的线程以外的线程间接访问具有自动存储持续时间的对象的结果是实现定义的。
  • @EOF 这正是我正在寻找的答案,谢谢。

标签: c pthreads heap-memory stack-memory


【解决方案1】:

这取决于堆栈分配变量相对于正在运行的线程的生命周期。

如果保证线程在堆栈变量超出范围之前退出(即您在所有等待的线程上调用pthread_join),那么使用局部变量就可以了。如果堆栈变量在线程仍在运行时超出范围,那么您将不得不动态分配它们。

【讨论】:

  • 此外,如果不同的线程需要不同的控制参数值,请确保每个线程都有自己的参数来查看。常见的错误之一是将相同的变量(本地堆栈或堆)传递给每个线程,在变量的某些元素中为每个线程赋予不同的值——这会导致混乱,因为线程的调度不是确定性的,并且是多线程的可能会看到相同的值,从而导致混乱。
猜你喜欢
  • 2015-07-26
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多