如题,学习 Go 的过程中认识到管道这种进程间通信方式,感觉确实是比直接共享内存更合适的线程间同步模型。
学习过程中产生一些问题,涉及到语言如何和操作系统相关联
1 、管道通常有一个阻塞读取功能,比如消费者调用 recv()后进入阻塞,然后由生产者向管道内丢入一个数据,消费者就可以解除阻塞并获取数据,相当于被唤醒,这在语言层面上是如何实现的呢,我们在业务代码中似乎没有办法显式地让一个线程进入阻塞,然后再用另一个线程去 trigger 这个线程。
2 、这种操作非常类似 socket 表现的性状,但我觉得怎么也不会用 socket 实现管道吧,我觉得对于统一进程内间的线程同步,socket 是一种非常昂贵的通信手段。
3 、我们是否有办法显示地管理线程,比如子线程主动进入 block,而后主线程主动唤醒子线程,这种管理是否是可以实现的。类似地,还有主动地关闭一个线程的需求,不过据我所知线程本身似乎是并未设计在外部干预下关闭的这么一个功能。
4 、类似地,java 语言中还有一个 wait 的状态,与 block 不同,wait 通常是指等待锁,而不是等待 IO,其他语言可以释放锁并唤醒一个 wait 线程,这与 block 又有什么区别呢? block 和 wait 的概念是 java 的概念还是操作系统的概念?
问的比较乱,基础不扎实,有了解的朋友请帮忙回复一下,谢谢大家。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.