线程访问另一个线程的堆栈

bph*_*bph 2 c multithreading posix pthreads

我是否认为线程可以访问另一个线程的堆栈中存在的变量是正确的?

这是假设尚未实例化堆栈变量的函数。

我想我在某处读到线程应该只共享堆内存,但是我现在在问那是否正确?

这是在C语言中使用POSIX pthreads。

P.P*_*.P. 5

严格来说,是否允许您从提供线程支持的C11角度访问另一个线程的堆栈变量(具有自动存储持续时间的变量),这是实现定义的行为(假设接口与POSIX线程不同)变量仍然存在(例如,您将局部变量的地址从主函数传递给通过创建的另一个线程,pthread_create并且主返回通过调用退出。pthread_exit因此传递给该线程的变量已消失,这将是未定义的行为。不同于在该函数返回后使用指向其他函数的局部变量的指针(是否为线程)。

但是实际上,这很可能适用于大多数(全部)POSIX线程实现。我不知道不支持此功能的任何POSIX实现。


看一下POSIX标准,它实际上要求支持对自动变量的访问:

流程中的单个控制流。每个线程都有自己的线程ID,调度优先级和策略,errno值,浮点环境,特定于线程的键/值绑定以及支持控制流所需的系统资源。可由线程确定其地址的任何对象,包括但不限于静态变量,通过malloc()获得的存储,通过实现定义的函数获得的可直接寻址的存储以及自动变量,均可在同一进程中访问所有线程。

(强调我的)。

因此,这对于任何POSIX实现都应该可以。

  • 是的(对您的第一条评论)。实现定义的行为主要来自C标准。但是[POSIX实际上保证](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_233)访问堆栈变量:“一个进程中的单个控制流。每个线程都有其[ ..]。可由线程确定其地址的任何对象,包括但不限于静态变量,通过malloc()获得的存储,通过实现定义的函数获得的可直接寻址的存储以及自动变量,均可由线程确定。同样的过程。” (2认同)
  • “ main()堆栈不能在所有线程完成之前被释放”-不一定。当* process *仍然存在时(与其他线程一起),主线程可以调用`pthread_exit`退出自身。当进程中的最后一个线程死亡时,该进程死亡/退出。 (2认同)