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

use*_*700 3 c multithreading operating-system kernel process

我正在学习操作系统课程,我们正在谈论线程.在Wikipedia上,它表示对于1:N内核线程:

如果其中一个线程需要执行I/O请求,则整个过程被阻止,并且无法利用线程优势

然而这让我思考.在C中,如果我在主线程上创建UI,如果我在使用pthread的新线程上执行I/O,则我的UI不会阻塞.这是否与维基百科所说的相矛盾,因为我仍然只有1个进程有2个线程,所以根据维基百科所说的,我的I/O线程不应该阻止我的用户界面吗?

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

Dan*_*ein 9

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

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

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