在Linux中,如果创建了两个线程并且它们都在运行,当其中一个线程调用recv()
或任何在没有数据可用时阻塞的IO系统调用时,整个过程会发生什么?
其他线程也会阻塞吗?我想这取决于线程的实现方式。如果线程库在用户空间中并且内核完全不知道进程内的线程,则进程是调度实体,因此两个线程都被阻塞。
此外,如果另一个线程由于此而没有阻塞,那么它是否可以通过相同的套接字send()
数据阻塞recv
线程?双工?
有什么想法吗?
答案 0 :(得分:2)
阻止一个线程中的调用不应该影响其他线程。
如果被阻塞的线程在进入被阻塞的调用之前锁定互斥锁并且第二个线程试图锁定相同的互斥锁,那么第二个线程需要等待阻塞调用完成并且第一个线程要释放锁。
答案 1 :(得分:2)
完全有可能在用户空间中实现线程,这样一个线程可以在I / O上的另一个线程阻塞时继续。
非阻塞线程应该能够在另一个线程阻塞的情况下发送套接字(我写过这样的代码)。
答案 2 :(得分:2)
你是绝对正确的,阻塞行为将取决于线程是在内核空间还是在用户空间中实现的。如果线程纯粹在用户空间中实现(也就是说,内核完全不涉及线程),那么进入内核的任何阻塞入口点都需要包含一些非阻塞变量,这些变量可以模拟其调用的阻塞语义“线程“(例如,使用AIO发送/ recv数据而不是阻塞,完成回调使线程再次运行)。
在Linux(以及我能想到的所有其他现存的主要操作系统)中,线程是在内核级别或类似实现的,并且对内核的阻塞调用将不导致所有其他线程块。
是的,你可以send()
到recv()
上另一个线程被阻止的套接字。