2014-03-07 75 views
1

标题是这样的问题:当一个线程退出,确实它的缓存内存就脸红到主存储器?线程的缓存在退出时是否会刷新到主内存?

我在想,因为在主线程创建一些线程的情况下,他们在数组的独立部分做了一些工作(彼此之间没有数据依赖关系),主线程加入所有工作线程,然后执行更多使用由工作线程计算得到的数组值进行计算。是否需要为主线程声明volatile以查看其副作用?

+0

哪种编程您使用的语言?请注意,行为通常由编程语言定义,而与操作系统和硬件体系结构无关。 – nosid

+0

@nosid我使用的并行线程和C – user3286380

+0

的CPU内存通常没有线程的概念 - 如果它被写入缓存,它会被刷新到较低的三级缓存和主内存最终,除非拆机过程或某物类似的排序会首先使这些缓存行无效。 – twalberg

回答

0

假设你用C这样做,如果数组是全球性的,或者您已经传递到包含在该线程需要做的计算和指向数组的索引线程,结构则由于数组内存在工作线程和主线程之间共享,因此数组不需要是易变的,以便主线程查看更改。

+0

“因为该存储器的工作线程和主线程之间共享的”适用于单变量情况下,同样,但它需要_does_挥发性。为什么不是一个数组? – user3286380

+0

通过使用volatile,您指示编译器不要对该变量进行任何优化,因为其他硬件或线程可能会更改该值。在这里,有人提到线程可以在数组的独立部分工作。例如,如果你的数组被索引为1-100,并且你有10个线程执行1-10,11-20 ... 91 -100,那么这些线程将不会相互影响。它会工作得很好(只要数组的分布是正确的)。我不明白为什么要在这种情况下通过使用volatile来阻止编译器优化?你能详细说明一下吗? –

+0

@knuckle_ball:你将_volatile_和_atomic_混合在一起。下面的问题是关于C++,但相同的是真正的C. http://stackoverflow.com/questions/8819095/concurrency-atomic-and-volatile-in-c11-memory-model – nosid