我有点新的线程,所以你不得不原谅这个问题的天真。
pthread_join是如何实现的,它是如何影响线程调度的?
我总是用一个while循环来描述pthread_join实现,只是让调用线程产生,直到目标线程完成。 像这样(非常近似的伪代码):
primefaces布尔完成;
thread_run {
做东西();
done = true;
}
thread_join {
while(!done){
thread_yield();
基本上,使调用“join”的线程
//我们的线程产生,直到我们的线程完成
}
}
这是一个准确的描述,还是我极大地简化了这个过程?
是否有可能从sched_entityfind相应的task_struct?
Windows计划任务重新启动后不工作
我们应该为通知组件使用哪个“平台”?
Quartz.NET与Windows计划任务。 他们有什么不同?
干杯!
nohup与现在的区别
sched_getcpu()在Linux上可靠吗?
在进程中调度线程
如何设置.NET框架的作业调度?
是的,这是一般的想法。 有关特定实现的细节,请看glibc 。
pthread_join可能在内部实现为等待线程退出时触发的信号量,无论是在调用pthread_exit还是在其主函数退出时触发。
在任何情况下,glibc的源代码是可用的,尝试谷歌代码搜索(我看到了一些信息的东西在那里)
一个线程通常有一个相关的小结构,即线程上下文。 这个结构可以塞满使线程“工作”所需的所有数据。
例如,访问该线程的线程特定键所需的数据结构的根,并在关闭时迭代它们以清除它们。
在这个结构中通常有一个类似于互斥体的锁,对于不同的部分也许有一个以上的锁。
线程上下文可以有一个小字段在终止线程可以放置其退出状态。 ( void *由pthread_exit返回或从线程函数返回。)
线程上下文还可以指示线程的状态(尚未创建,正在运行,已停止)。
在准备终止状态并指示它正在终止之后,可能有一个同步原语,例如线程可以kick的条件变量或信号量。
pthread_join函数可以等待该同步原语。 一旦等待完成,该函数可以触发资源清理该线程,除了拉出状态。
线程在发送加入信号后继续执行。 要做到这一点,它必须继续有一个堆栈上下文。 在那之后,系统必须解决在后台干净地停止线程的问题。
线程的用户空间实现可以推迟到内核。 例如,一些信号可以熄灭,或者表示线程已经完成。 在这一点上,用户空间知道该线程不可能再使用它的堆栈,并且可以回收它。
在内核中,调度程序可以“吃”一个线程。 线程可以调用调度程序中的一些函数,在清除大部分资源后永远不会返回。 它将线程标记为死亡,并将上下文切换到另一个线程。 线程的堆栈将永远不会再被使用(因为该函数永远不会返回),并且可以回收它的任务结构以及任何附加的东西。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。