【问题标题】:Does a thread's cache get flushed to main memory when it exits?线程的缓存在退出时是否会刷新到主内存?
【发布时间】:2014-04-10 01:56:47
【问题描述】:

题目是问题:当一个线程退出时,它的缓存内存是否会刷新到主内存?

我想知道,因为主线程创建一些线程的情况很常见,它们在数组的独立部分上做一些工作(彼此之间没有数据依赖关系),主线程连接所有工作线程,然后进行更多计算使用工作线程计算产生的数组值。数组是否需要声明为volatile 以便主线程查看它的副作用?

【问题讨论】:

  • 您使用哪种编程语言?请注意,行为通常由编程语言定义,独立于操作系统和硬件架构。
  • @nosid 我正在使用 pthreads 和 C。
  • CPU 内存缓存通常没有线程的概念——如果它被写入缓存,它最终会被刷新到较低的缓存级别和主内存,除非进程崩溃或类似的东西首先使这些缓存行无效。
  • @twalberg 是的,但是操作系统有线程的概念。我想知道当线程结束时操作系统是否会导致缓存刷新,以便其他线程可以看到它对内存的修改。不过,caf 似乎已经回答了我的问题。

标签: c multithreading caching operating-system pthreads


【解决方案1】:

假设您在 C 中执行此操作,并且如果数组是全局的,或者您已将结构传递给线程,其中包含线程需要对其进行计算的索引和指向数组的指针,那么数组由于数组内存在工作线程和主线程之间共享,因此主线程不需要易失性来查看更改。

【讨论】:

  • “因为内存在工作线程和主线程之间共享”也适用于单变量情况,但它确实需要 volatile。为什么不是数组?
  • 通过使用 volatile,您可以指示编译器不要对该变量进行任何优化,因为其他一些硬件或线程可能会更改该值。在这里,提到线程将在数组的独立部分上工作。例如:如果您的数组从 1-100 索引,并且您有 10 个线程在 1-10、11-20...91 上执行操作-100 分别那么这些线程不会相互影响。它会正常工作(只要数组的分布是正确的)。我不明白你为什么要在这种情况下通过使用 volatile 来防止编译器优化?你能详细说明一下吗?
  • @knuckle_ball:你把 volatileatomic 混为一谈了。以下问题是关于 C++ 的,但 C 也是如此。stackoverflow.com/questions/8819095/…
【解决方案2】:

pthreads 规范要求pthread_join()"synchronizes memory with respect to other threads" 的函数之一,所以在pthreads 的情况下你没问题 - 在pthread_join() 返回后,主线程将看到由加入的线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多