说进程中的所有线程共享相同的数据是什么意思?

时间:2012-08-07 13:56:16

标签: pthreads

在我的教科书中说:

  

进程中的所有线程都可以访问相同的数据(共享)

但每个线程都有自己的堆栈,这意味着不共享局部变量。那么什么样的数据线程可以共享。

更新

我发现每个线程都可以共享全局变量,这让我感到困惑,我学习全局变量的全局变量是静态堆栈,不应该分享每个线程都有自己的堆栈。

5 个答案:

答案 0 :(得分:2)

  

我发现每个线程都可以共享全局变量,这让我很困惑,   我学习全局全局变量是静态堆栈,它不应该   每个线程都有自己的堆栈。

您对堆栈的考虑太多,还有其他内存区域,例如databss。具有静态存储的对象(例如全局变量和使用修饰符static声明的对象)在所有线程之间共享。

此外,如果您努力尝试,所有线程都可以访问所有内容,对于不同的“堆栈”并没有什么特别之处。如果一个线程设法获得指向另一个“堆栈”上的位置的指针,它可以自由地读取它,修改它等。

所有这一切的要点是线程不只是共享变量。它们只是在同一虚拟内存空间

答案 1 :(得分:2)

首先,共享全局变量和静态变量。

其次,来自malloc的内存可以通过全局变量中的指针(或通过指针......)来共享。

第三,一个线程堆栈中的内存可以通过全局变量中的指针(或通过指针......)来共享。

实际上,所有这些都是共享的,但不是所有的都可以访问。线程A可以访问线程B的堆栈,但是除非线程B执行类似将其堆栈中的某些内容的地址分配给全局(不要那样做)或者你正在做某事的事情,否则它将没有指向这样做的指针。你在哪里检查线程的细节并按照你的方式进入堆栈(如果你这样做,你对pthreads实现的机制比我更了解,所以我不会告诉你不要这样做,但通常不会轻易做到。)

大多数情况下,你只需要担心全局和静态,并且可以考虑只在本地处理的任何东西都是线程安全的,但是一旦你从前者到达后者就会被吹走。

*实际上,我对此知之甚少,而且主要是基于其他语言的线程知识。实际上,它是一个通用的线程而不是特定的pthread,除了一些其他语言甚至不会让你陷入从全局引用堆栈内存的陷阱。

答案 2 :(得分:1)

@cnicutar关于静态存储是正确的。实际上对这个in another question进行了很好的讨论。尽管这个问题的标题,那里的答案(特别是前两个)确实很好地回答了你的问题,我认为我不能做得更好。

答案 3 :(得分:0)

如前所述,每个线程都有自己的堆栈。因此,据说这个堆栈上的数据是线程安全的,因为它只拥有它。

All threads within a process have access to the same data (share)

正如它所暗示的,多个线程可以访问相同的数据。这应该会引发一些迷你警报,因为你必须开始考虑线程同步(关键部分,互斥体等)与共享的资源。

在堆上分配的资源说通过new运算符被共享,因为所有线程都可以访问同一个堆。

答案 4 :(得分:0)

我不认为将为每个线程分配静态数据。 它只会被实例化一次,并且在execute()方法中具有静态数据声明的所有线程都可以访问它。