现在发现一个问题,在C++使用go语言编译出来的动态lib时,如果主进程退出,用 fork出来的子进程调用go lib中的函数时,会出现卡死状态,而直接采用主进程调用go lib中的函数就不会卡死。
看了一下系统堆栈,看起来是在等待锁
[<ffffffffaf50ce56>] futex_wait_queue_me+0xc6/0x130
[<ffffffffaf50db3b>] futex_wait+0x17b/0x280
[<ffffffffaf50f886>] do_futex+0x106/0x5a0
[<ffffffffaf50fda0>] SyS_futex+0x80/0x190
[<ffffffffafb74ddb>] system_call_fastpath+0x22/0x27
[<ffffffffffffffff>] 0xffffffffffffffff
外层调用的函数是_cgo_wait_runtime_init_done
![CE4640DE-9FC0-4d16-BEEC-EA62FBE17740.png](https://static.studygolang.com/210419/b49e159230b0577e3f10719585a97d2a.png)
上面是cgo的源码,应该就是等待锁。
更多评论
c调用go的动态库,应该只能在主进程中,我记得以前golang里面有人提issue,官方说是暂时没考虑解决,我以前加载完go的动态库,也是无法unload
#3