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

时间:2018-04-12 10:49:46

标签: c multithreading pthreads posix

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

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

我想我在哪里读过线程应该只共享堆内存但我现在正在质疑这是否正确?

这是在C中使用POSIX pthreads。

1 个答案:

答案 0 :(得分:4)

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

但实际上,这可能适用于大多数(所有?)POSIX线程实现。我不知道任何不支持这种情况的POSIX实现。

查看POSIX standard,实际上需要支持访问自动变量:

  

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

(强调我的)。

所以这对任何POSIX实现都应该没问题。