c - 当一个线程被阻塞时,其他线程会发生什么?

标签 c multithreading

在 Linux 中,如果创建了两个线程并且它们都在运行,当其中一个调用 recv() 或任何在没有数据可用时阻塞的 IO 系统调用时,会发生什么情况全过程?

其他线程也会阻塞吗?我想这取决于线程的实现方式。如果线程库在用户空间,而内核完全不知道进程中的线程,那么进程就是调度实体,因此两个线程都被阻塞了。

此外,如果另一个线程没有因此而阻塞,那么它是否可以通过阻塞 的同一个套接字发送() 数据recv 线程?双面打印?

有什么想法吗?

最佳答案

您完全正确,阻塞行为将取决于线程是在内核空间还是在用户空间中实现。如果线程纯粹在用户空间中实现(也就是说,内核完全不涉及线程),那么任何进入内核的阻塞入口点都需要用一些非阻塞变体来包装,这些变体可以模拟其调用的阻塞语义“线程”(例如,使用 AIO 发送/接收数据而不是阻塞,并且完成回调使线程再次可运行)。

在 Linux(以及我能想到的所有其他现存的主要操作系统)中,线程是在内核级别或类似级别实现的,并且对内核的阻塞调用不会导致所有其他线程 block 。

是的,您可以send() 到另一个线程在recv() 上被阻塞的套接字。

关于c - 当一个线程被阻塞时,其他线程会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2150626/

相关文章:

c++ - C++ 中原子更新最有效的 CAS 实现是什么?

.net - .Net同步时钟读取方法仅在更新时

Java:在鼠标单击事件上启动线程

c - 是否将数组转换为 C 中可移植的同构结构?

c - 关于 C 中的原子性保证

c - 我无法弄清楚为什么在我的头文件中调用方法时出现 undefined reference 问题

c - 函数什么都不做

java - 可以不使用 JNI 直接在 Java 中加载 C 库吗?

c++ - QThread 错误,未在此范围内定义

java - 如何从 CompletableFuture 返回主线程