Golang Go语言中 runtime 获取线程失败

runtime 代码地址:

https://cs.opensource.google/go/go/+/master:src/runtime/proc.go;l=2261?q=startm&sq=&ss=go%2Fgo

测试环境跑的一个服务,抛出了这个异常 throw("startm: p has runnable gs") 然后进程退出

看代码,这个 throw 应该是 要获取 空闲的 m 但是获取后检测发现 m 并不空闲而是已经分配了 g 于是 throw ,想问下 v 站的朋友,这个 case 什么情况下才会发生?


Golang Go语言中 runtime 获取线程失败

更多关于Golang Go语言中 runtime 获取线程失败的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

runtime 一般不会出错,除非自己动了源码。如果能复现可以提供下更多信息

更多关于Golang Go语言中 runtime 获取线程失败的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,使用runtime包来获取线程信息通常是通过一些底层的、非公开的API来实现的,因为这些API并未在标准库的公开文档中明确说明,所以直接调用它们可能会导致一些问题,包括“获取线程失败”的错误。以下是一些可能的原因和解决方法:

  1. API使用不当:确保你使用的是正确的方法和字段来访问线程信息。由于这些API是底层的,对它们的使用需要非常谨慎。

  2. 版本不兼容:不同版本的Go语言可能在runtime包的实现上有所不同。如果你正在使用的代码是基于旧版本的Go编写的,那么在新版本上运行可能会遇到问题。检查你的Go版本,并确保代码与你的Go版本兼容。

  3. 资源限制:如果系统资源(如内存、CPU等)受到限制,可能会导致runtime包在尝试获取线程信息时失败。检查系统的资源使用情况,并确保有足够的资源可供Go程序使用。

  4. 并发问题:如果你的程序在多线程环境中运行,并且多个线程同时尝试访问runtime包中的某些资源,可能会导致竞争条件。确保对runtime包的访问是线程安全的。

  5. 使用标准库:如果可能的话,尽量使用Go标准库提供的API来获取线程信息,而不是直接依赖runtime包的底层API。标准库提供了更稳定、更安全的接口。

如果问题仍然存在,建议查看Go的官方文档或搜索相关的社区和论坛以获取更具体的帮助。

回到顶部