|
|
1
2
首先,全局变量和静态变量是共享的。 其次,可以通过全局变量中的指针(或通过…的指针)访问的malloc内存是共享的。 第三,一个线程堆栈中的内存,您可以通过全局变量中的指针(或通过…的指针)访问该内存。 实际上,所有这些都是共享的,但并不是所有这些都可以访问。线程A可以访问线程B的堆栈,但它不会有指针通过,除非线程B做了一些事情,比如将其堆栈中某个东西的地址分配给全局(不要这样做),或者你正在做一些事情,检查线程的细节并进入它们的堆栈(如果你这样做,你对pthreads实现的机制比我了解得多*,所以我不会告诉你不要这样做,但通常情况下,这不是一件容易的事情)。 大多数情况下,你只需要担心全局和静态,并且可以认为任何只在本地进行交易的事情都是线程安全的,但一旦你能从前者到达后者,这一点就会被打破。 *事实上,我对此知之甚少,而且主要是基于其他语言中的线程知识。实际上,这是一个通用的线程处理,而不是pthreads特定的线程,只是其他一些语言甚至不会让您陷入从全局引用堆栈内存的陷阱。 |
|
|
2
2
你对堆栈考虑太多了,还有其他内存区域,比如
此外,如果你努力,所有线程都可以访问 每件事 ,不同的“堆栈”没有什么特别之处。如果一个线程设法获得指向另一个“堆栈”上某个位置的指针,它可以自由读取、修改它等等。 所有这一切的要点是线程不仅仅共享变量。他们只是 在同一虚拟内存空间中 。 |
|
|
3
1
@cnicutar关于静态存储的观点是正确的。事实上,关于这一点有一个很好的讨论 in another question 。尽管这个问题的标题是,但那里的答案(尤其是前两个)确实很好地回答了你的问题,我认为我做得再好不过了。 |
|
|
4
0
如前所述,每个线程都有自己的堆栈。因此,这个堆栈上的数据被认为是线程安全的,因为只有它拥有它。
正如它所暗示的,多个线程可以访问相同的数据。这应该会敲响一些小警钟,因为您必须开始考虑线程同步(关键部分、互斥体等)到共享资源。 由于所有线程都可以访问同一堆,因此通过新操作符在堆上分配的资源是共享的。 |
|
|
5
0
我不认为静态数据会被分配给每个线程。 它将只被实例化一次,并且所有在execute()方法中声明了该静态数据的线程都可以访问它。。 |