在我的教科书中说:
进程中的所有线程都可以访问相同的数据(共享)
但每个线程都有自己的堆栈,这意味着不共享局部变量。那么什么样的数据线程可以共享。
更新
我发现每个线程都可以共享全局变量,这让我感到困惑,我学习全局变量的全局变量是静态堆栈,不应该分享每个线程都有自己的堆栈。
答案 0 :(得分:2)
我发现每个线程都可以共享全局变量,这让我很困惑, 我学习全局全局变量是静态堆栈,它不应该 每个线程都有自己的堆栈。
您对堆栈的考虑太多,还有其他内存区域,例如data
或bss
。具有静态存储的对象(例如全局变量和使用修饰符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()方法中具有静态数据声明的所有线程都可以访问它。