【问题标题】:How is pthread_join implemented?pthread_join 是如何实现的?
【发布时间】:2010-05-12 18:57:20
【问题描述】:

我对线程有点陌生,所以你必须原谅这个问题的幼稚。

pthread_join 是如何实现的,它如何影响线程调度?

我总是想象pthread_join 是用一个while 循环来实现的,它只是让调用线程让步,直到目标线程完成。像这样(非常近似的伪代码):

原子布尔完成; 线程运行{ 做东西(); 完成=真; } 线程加入{ 而(!完成){ 线程产量(); // 基本上,创建调用“join”的线程 // 我们的线程屈服直到我们的线程完成 } }

这是一个准确的描述,还是我过度简化了这个过程?

干杯!

【问题讨论】:

    标签: linux multithreading pthreads scheduling


    【解决方案1】:

    pthread_join 可能在内部实现为等待线程退出时触发的信号量,无论是在调用 pthread_exit 时还是在其主函数退出时。

    无论如何,glibc 的源代码是可用的,尝试 google 代码搜索(我在那里看到了一些信息丰富的东西)

    【讨论】:

    【解决方案2】:

    是的,这是一般的想法。有关特定实现的详细信息,请查看 glibc

    【讨论】:

    • 他的代码和真实代码之间唯一真正大的区别是,如果有备用内核,他的代码会导致加入线程消耗 100% 的 CPU。
    【解决方案3】:

    线程通常有一个与之关联的小结构,即线程上下文。该结构可以填充使线程“工作”所需的所有数据。

    例如,数据结构的根需要访问该线程的线程特定键,并在它被关闭时对其进行迭代以清理它们。

    该结构中通常有一个类似互斥锁的锁,对于不同的部分可能不止一个。

    线程上下文中可以有一个小字段,终止线程可以在其中放置其退出状态。 (pthread_exit 或线程函数返回的void *。)

    线程上下文还可以指示线程的状态(尚未创建、运行、停止)。

    可能有一个同步原语,例如条件变量或信号量,线程在准备好终止状态并指示它正在终止后,可以kick

    pthread_join 函数可以等待该同步原语。等待完成后,该函数可以触发对该线程的资源清理,以及提取状态。

    线程在发出加入信号后继续执行。为此,它必须继续拥有带有堆栈的上下文。在那之后,系统必须解决在后台干净地停止线程的问题。

    线程的用户空间实现可以将其推迟到内核。例如。一些信号可能会消失或任何表明线程已完成的信号。到那时,用户空间知道线程不可能再使用它的堆栈并且可以回收它。

    在内核中,调度程序可以“吃掉”一个线程。线程可以调用调度程序中的某些函数,这些函数在清理其大部分资源后永远不会返回。它将线程标记为死线程并将上下文切换到另一个线程。线程的堆栈将永远不会被再次使用(因为该函数永远不会返回)并且可以回收,以及它的任务结构和附加到它的任何剩余的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 2011-04-26
      • 2015-05-22
      • 2015-04-22
      • 2020-07-31
      • 2011-04-24
      相关资源
      最近更新 更多