gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:01:32 25 4
gpt4 key购买 nike

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

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

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

有什么想法吗?

最佳答案

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com