C 当一个线程被阻塞时,其他线程会发生什么情况?

C 当一个线程被阻塞时,其他线程会发生什么情况?,c,multithreading,C,Multithreading,在Linux中,如果创建了两个线程并且两个线程都在运行,当其中一个线程调用recv()或任何IO系统调用在没有可用数据时阻塞时,整个进程会发生什么情况 另一个线程也会阻塞吗?我想这取决于线程的实现方式。如果线程库位于用户空间,内核完全不知道进程中的线程,那么进程就是调度实体,因此两个线程都被阻塞了 此外,如果另一个线程没有因此而阻塞,那么它能否通过同一个套接字发送()数据,该套接字正在阻塞recv线程?双工 有什么想法吗?在一个线程中阻止调用不应影响其他线程 如果被阻止的线程在进入被阻止的调用之

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

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

此外,如果另一个线程没有因此而阻塞,那么它能否通过同一个套接字
发送()
数据,该套接字正在阻塞
recv
线程?双工


有什么想法吗?

在一个线程中阻止调用不应影响其他线程


如果被阻止的线程在进入被阻止的调用之前锁定了一个互斥体,而第二个线程试图锁定同一个互斥体,然后,第二个线程需要等待阻塞调用完成,第一个线程释放锁。

完全可以在用户空间中实现线程,这样一个线程可以继续,而另一个线程在I/O上阻塞


当另一个线程在套接字上阻塞时,非阻塞线程应该能够在套接字上发送数据(我已经编写了这样的代码)。

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

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


是的,您可以
send()
发送到另一个线程在
recv()
上被阻止的套接字,谢谢,然后转到第二个问题:当recv()时,另一个非阻止线程可以通过同一套接字发送()数据吗正在阻止另一个?假设UDP。只有在系统调用支持所有非阻止调用的情况下才可能。很有可能在像fstat这样的东西上暂停所有用户线程几秒钟。@Zan Lynx:他说的是Linux,它有POSIX complient aio_read()和aio_write()系统调用。你注意到我说的“像fstat吗?”这是一个POSIX调用,据我所知没有异步版本。还有其他问题。还有一个问题,在线程调用recv()之前是否有数据到达套接字,线程真的会得到这些数据吗?是的。这是它唯一能工作的方法,在非阻塞数据报套接字上。一些我想提供帮助的小注意事项-第一,你可以很容易地尝试这类事情。编写一个小程序,它将
接受
连接,然后
睡眠
一段时间,然后c新连接上的所有
recv
。使用
nc
(netcat)或其他方法创建与服务器的连接,并立即向其写入一些数据。您将看到服务器获得与您发送的数据相同的数据。第二个注意事项-这实际上是通常是每次提问论坛上的第三个不同问题。。。