Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Pthread库实际上是用户线程解决方案吗?_Multithreading_Pthreads_Kernel - Fatal编程技术网

Multithreading Pthread库实际上是用户线程解决方案吗?

Multithreading Pthread库实际上是用户线程解决方案吗?,multithreading,pthreads,kernel,Multithreading,Pthreads,Kernel,标题可能不够清楚,因为我不知道如何定义我的问题 我知道Pthread是一个符合POSIX标准的线程库(关于POSIX,请参阅wikipedia:)。它在类似Unix的操作系统中可用 关于线程,我读到有三种不同的模型: 用户级线程:内核不知道它。用户自己创建/实现/销毁线程 内核级线程:内核直接支持进程中的多个控制线程 轻量级进程(LWP):由内核调度,但可以与用户线程绑定 你看到我的困惑了吗?当我调用pthread\u create()创建线程时,我是否创建了用户级线程?我想是的。那么我可以说,

标题可能不够清楚,因为我不知道如何定义我的问题

我知道Pthread是一个符合POSIX标准的线程库(关于POSIX,请参阅wikipedia:)。它在类似Unix的操作系统中可用

关于线程,我读到有三种不同的模型:

用户级线程:内核不知道它。用户自己创建/实现/销毁线程

内核级线程:内核直接支持进程中的多个控制线程

轻量级进程(LWP):由内核调度,但可以与用户线程绑定


你看到我的困惑了吗?当我调用
pthread\u create()
创建线程时,我是否创建了用户级线程?我想是的。那么我可以说,Pthread为线程提供了一个用户级的解决方案吗?它不能操作内核/LWP?

Pthreads只是线程库的标准化接口。创建操作系统线程还是轻量级线程取决于您使用的库。然而,我的第一个客人是,您的线程是“真正的”操作系统级线程

问:我知道Pthread是一个符合POSIX标准的线程库

A:是的。实际上,“Pthreads”代表“Posix线程”:

问:它在类似Unix的操作系统中可用

答:事实上,它可用于许多不同的操作系统。。。包括Windows、MacOS。。。当然,还有Linux、BSD和Solaris

问:关于线程,我读到有三种不同的模型

现在你变得模糊了。“线程”是一个非常通用的术语。有很多很多不同的模型。还有很多很多不同的方法可以描述和/或实现“线程”。包括Java线程模型或Ada线程模型之类的东西

问:当我调用pthread_create()来创建线程时,我是否创建了 用户级线程

答:是的:你在用户空间中所做的一切都在你自己的私人“用户空间”中得到“保护”

用户级线程:内核不知道

答:不,内核什么都知道:)

Q:内核级线程:内核直接支持 过程中的控制

答:是的,有“内核线程”这种东西

而且,碰巧的是,Linux广泛使用内核线程。例如,Linux系统中的每个进程都是“内核线程”。每个用户创建的pthread也被实现为一个新的“内核线程”。“工作线程”(对于任何用户级进程都是完全不可见的)也是如此

但是为了有效地使用pthreads,这是一个高级主题,您不需要理解。这里有一本很棒的书,详细讨论了这一点以及许多其他主题:

记住:“Pthreads”是一个接口。它的实现方式取决于平台。Linux使用内核线程;Windows使用Win32线程等

=========================================================================== 增编:

由于人们似乎仍在追问这一老生常谈,我认为参考这篇文章会很有用:

Linux通常使用两种pthread实现: 以及, 尽管前者在很大程度上已经过时。2.6中的内核提供了 NPTL提供了更接近SUSv3的一致性,并执行 更好,尤其是当有很多线程时

您可以查询 使用命令在shell下具体实现pthreads:

getconf GNU_LIBPTHREAD_版本

您还可以在中获得更详细的实现差异


“Pthreads”是一个基于Posix标准的库。pthreads库的实现方式因平台和库而异。

pthreads本身并不是真正的线程库。pthreads是特定线程库使用该平台上可用的并发资源实现的接口。因此,在linux、bsd、solaris等平台上都有pthreads实现,虽然接口(头文件和调用的含义)相同,但每个接口的实现都不同

因此,就内核线程对象而言,pthread_create的实际功能因操作系统和pthread库实现而异。在第一种近似情况下,您不需要知道(pthread抽象允许您不需要知道这些内容)。最终,您可能需要看到“幕后”,但对于大多数pthread用户来说,这并不是必需的


如果您想知道/specific/pthread实现在特定操作系统上的作用,您需要澄清您的问题。例如,Solaris和Linux所做的是非常不同的。

@paulsm4我怀疑你关于内核无所不知的评论。在这个特定的用户级线程上下文中,内核不知道这样的事情正在发生。用户级线程的调度由用户自己维护(通过库提供的接口),内核最终只为整个进程分配一个内核线程。内核将进程视为一个单线程,其中一个线程的任何阻塞调用都将阻塞该进程的所有线程。 请参阅Linux中的pthread。内核(v2.6+)实际上是用实现的。让我引用维基的内容:

NPTL是一个所谓的1×1线程库,用户创建的线程(通过pthread_create()库函数)与内核中的可调度实体(Linux中的任务)具有1-1对应关系。这是最简单的线程实现


所以linux内核中的pthread实际上是作为内核线程实现的

我发现以前的答案并不像我希望的那样令人满意或清晰,所以我想:

当你打电话的时候

pthread_create(...)
您总是创建一个新的用户级线程。假设有操作系统,总是有一个或多个内核线程…但是让我们