Golang Go语言中 goroutine 调用别的 dll 的同步操作,也一样会休眠等待 dll 返回吗?

发布于 1周前 作者 caililin 来自 Go语言

比如调用的那个 DLL 内部操作是一个同步网络请求,很卡很费时
Golang Go语言中 goroutine 调用别的 dll 的同步操作,也一样会休眠等待 dll 返回吗?

5 回复

这个看 goroutine 的实现原理,阻塞式 IO 会不会 释放当前系统线程 让其它 Goroutine 跑起来 你可以把系统线程 设置为 1 然后跑两个 GoRoutine 试试

更多关于Golang Go语言中 goroutine 调用别的 dll 的同步操作,也一样会休眠等待 dll 返回吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


goroutine 可以看成是轻量线程,即使是 cpu bound 也不会阻塞主线程

有参考 url 么?

先说结论: 是的,会休眠等待。

goroutine 在调用 syscall.Syscall*() 时会将系统线程设置为系统调用,保存堆栈,释放当前 goruntine 对 goruntine 数量的占用。

在Golang(通常简称为Go)中,当goroutine调用外部DLL(动态链接库)时,其行为与在普通函数中调用DLL相似。关于同步操作和休眠等待的问题,具体取决于调用的方式和DLL的行为。

  1. 同步调用:如果goroutine通过同步方式(如直接函数调用)调用DLL,那么它确实会等待DLL操作完成并返回结果。在这个等待期间,goroutine会被阻塞,不会执行其他任务。这类似于在任何其他编程语言中进行的同步函数调用。

  2. 异步调用:如果DLL提供了异步接口(例如,通过回调函数或事件通知),并且goroutine使用了这种异步方式,那么goroutine可以在调用后立即继续执行其他任务,而无需等待DLL操作完成。然而,这通常需要额外的代码来处理异步结果或通知。

  3. 考虑并发:由于goroutine是Go语言中的轻量级线程,你可以通过启动多个goroutine来并发调用DLL或执行其他任务。但是,如果多个goroutine需要同步访问同一个DLL资源,你可能需要使用同步机制(如互斥锁)来避免竞争条件。

综上所述,goroutine调用DLL是否会休眠等待,取决于调用的具体方式和DLL的接口设计。在大多数情况下,如果进行同步调用,goroutine会等待DLL返回结果。然而,通过合理的并发和异步设计,可以避免不必要的等待,从而提高程序的效率和响应性。

回到顶部