当一个线程在 C 中阻塞时,为什么整个进程不会阻塞

When one thread blocks in C, why doesn't the entire process block

我正在学习操作系统课程,我们正在谈论线程。在维基百科 here 上,它说对于 1:N 内核线程:

If one of the threads needs to execute an I/O request, the whole process is blocked and the threading advantage cannot be utilized

但这让我开始思考。在 C 中,如果我在主线程上创建 UI 并且如果我使用 pthread 在新线程上执行 I/O 那么我的 UI 不会阻塞。这与维基百科所说的不矛盾吗,因为我仍然只有 1 个进程和 2 个线程,所以根据维基百科的说法,我的 I/O 线程不应该阻塞我的 UI 吗?

编辑:如果 Windows 和 OS X 使用维基百科声称的 1:1 模型,那么为什么在 OSX 中执行 top 命令或Windows 使用任务管理器我没有看到每个程序线程的单独进程,为什么我仍然看到 1 个进程下列出的多个线程?

我的第一个想法是你引用的 Wiki 声明是不正确的。使用线程的主要原因之一是 I/O 操作不会阻塞整个进程。

维基百科指的是用户级线程,其中将整个线程组分配给单个内核线程。因此,当其中一个线程执行 I/O 操作时,控制权将传递给内核,内核线程将在等待 I/O 操作完成时阻塞。但是由于组中的每个线程都映射到同一个内核线程,其余线程也会阻塞。

另一方面,Pthreads 不是 用户级线程。每个pthread在内核中映射到不同的线程(进程),内核负责调度这些线程。如果您的 GUI 应用程序创建了一个执行 I/O 操作的新 pthread,该线程将不会阻塞主应用程序,因为它们在内核中是 不同的线程

关于您的编辑:您看到特定进程下的线程数的原因是每个线程组都有一个启动进程并创建线程的父线程。在您的示例中,它将是 GUI 应用程序 - 它生成的每个线程都会 "point" 它(实现特定于 OS,Linux 例如具有 tgid 字段这是父线程的pid)。您通常对进程的性能而不是特定线程的性能感兴趣,因此所有线程的数据都聚合在父线程下。