- 主题:channel如何唤醒receiver?
我本来是以为Rust的channel中,sender写了数据后,是通过pthread_cond_signal()来唤醒receiver的。
但刚才写了个示例程序,然后用 strace 执行,并没有发现任何的系统调用,receiver就被唤醒了。
那是用什么方法唤醒的? 多线程间的唤醒,是可以不经过系统调用的吗?
--
FROM 183.156.91.*
按我的理解,如果一个线程调用了某个阻塞的函数,比如读网络、epoll_wait、sleep等,也包括这里receiver调用的recv(),那么内核就不会调度到这个线程了,因为就算调度了也是阻塞,也不能继续执行。
而是要到阻塞的事件来了,把这个线程激活了,才能调度。而我问的,就是如何channel的场景下,如果激活receiver线程。
【 在 RunningOn 的大作中提到: 】
: 不用唤醒吧,多线程的数据通信,由系统调度CPU资源,等到线程的时间片了自然醒。
:
--
FROM 183.156.91.*
知道了,是我的问题。。。。
strace默认不监控子线程的系统调用,要加-f参数显式指定才行。
加了-f后发现还是有系统调用的。那跟预期相符了。
--
FROM 183.156.91.*