Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C pthread函数参数应该在堆栈或堆上分配吗?_C_Pthreads_Heap Memory_Stack Memory - Fatal编程技术网

C pthread函数参数应该在堆栈或堆上分配吗?

C pthread函数参数应该在堆栈或堆上分配吗?,c,pthreads,heap-memory,stack-memory,C,Pthreads,Heap Memory,Stack Memory,我已经使用pthreads编写了生产者-消费者/有界缓冲区问题的“解决方案”,并使用72位结构来存储所有线程共享的数据和同步类型。这个结构是在堆上分配的,但是在堆栈上分配它并在pthread\u create中传递它的地址也可以。在不使用pthread\u detach的情况下,是否有任何理由更喜欢pthread参数的堆栈分配而不是堆分配(反之亦然) 编辑: 结构在main()中声明,所有线程都保证在main()完成之前完成。超出范围不是问题。这取决于与运行线程相关的堆栈分配变量的生存期 如果保

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

编辑:

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

这取决于与运行线程相关的堆栈分配变量的生存期


如果保证线程在堆栈变量超出范围之前退出(即在所有等待的线程上调用
pthread\u join
),那么使用局部变量就可以了。如果堆栈变量在线程仍在运行时超出作用域,则必须动态分配它们。

我对此表示怀疑,只是在从堆栈传递参数时要小心数据作用域。如果堆栈中的数据超出范围(例如,当函数退出时),并且线程仍在处理它。。根据您的编辑,您的问题似乎更多地与何时使用自动和动态存储分配有关。鉴于您的数据结构很小,我会使用automatic。这里有几个关于处理该主题的问题之一:C11标准草案n1570:6.2.4对象的存储持续时间5一个标识符声明时没有链接且没有存储类说明符static的对象具有自动存储持续时间,一些复合文字也是如此。试图从与对象关联的线程以外的线程间接访问具有自动存储持续时间的对象的结果是实现定义的。@EOF这正是我想要的答案,谢谢。此外,如果不同的线程需要不同的控制参数值,确保每个线程都有自己的参数来查看。一个常见的错误是将相同的变量(本地堆栈或堆)传递给每个线程,在变量的某个元素中给每个线程一个不同的值——这会导致混乱,因为线程的调度是不确定的,多个线程可能会看到相同的值,从而导致混乱。