3

在我的教科书中它说:

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

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

更新:

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

4

5 回答 5

2

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

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

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

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

于 2012-08-07T13:58:28.617 回答
2

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

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

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

确实,所有这些都是共享的,所有时间,但并非所有都可以访问。线程 A 可以访问线程 B 的堆栈,但除非线程 B 执行诸如将其堆栈中某物的地址分配给全局(不要这样做)或您正在做某事之类的事情,否则它不会有一个指针来执行此操作您在其中检查线程的详细信息并进入它们的堆栈(如果您这样做,那么您对 ​​pthreads 实现的机制比我更了解*,所以我不会告诉您不要这样做,但作为一项规则,这不会是轻率的事情)。

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

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

于 2012-08-07T14:20:30.963 回答
1

@cnicutar 关于静态存储是正确的。实际上,在另一个问题中对此进行了很好的讨论。尽管那个问题的标题,那里的答案(尤其是前两个)确实很好地回答了你的问题,我认为我不能做得更好。

于 2012-08-07T14:10:23.050 回答
0

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

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

正如它所暗示的,多个线程可以访问相同的数据。这应该会敲响一些小警钟,因为您必须开始考虑线程同步(关键部分、互斥锁等)到共享资源。

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

于 2012-08-07T14:07:10.253 回答
0

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

于 2012-08-07T14:24:25.597 回答