go语言的系统暂停函数 go语言运行时( 二 )


runtime.Goexit函数被调用后 , 会立即使调用他的Groution的运行被终止,但其他Goroutine并不会受到影响 。runtime.Goexit函数在终止调用它的Goroutine的运行之前会先执行该Groution中还没有执行的defer语句 。
runtime.Gosched函数的作用是暂停调用他的Goroutine的运行 , 调用他的Goroutine会被重新置于Gorunnable状态,并被放入调度器可运行G队列中 。
runtime.NumGoroutine函数在被调用后,会返回系统中的处于特定状态的Goroutine的数量 。这里的特指是指Grunnable\Gruning\Gsyscall\Gwaition 。处于这些状态的Groutine即被看做是活跃的或者说正在被调度 。
注意:垃圾回收所在Groutine的状态也处于这个范围内的话,也会被纳入该计数器 。
前者调用会使调用他的Goroutine与当前运行它的M锁定到一起 , 后者调用会解除这样的锁定 。
注意:
debug.SetMaxStack函数的功能是约束单个Groutine所能申请的栈空间的最大尺寸 。
debug.SetMaxThreads函数的功能是对go语言运行时系统所使用的内核线程的数量(确切的说是M的数量)进行设置
会让运行时系统进行一次强制性的垃圾收集 , 
用于设置一个比率(垃圾收集比率),前面所说的单元增量与前一次垃圾收集时的岁内存的单元数量和此垃圾手机比率有关 。
触发垃圾收集的堆内存单元增量=上一次垃圾收集完的堆内存单元数量*(垃圾收集比率/100)
golangos.exit阻止设置可同时执行的逻辑Cpu数量 , 默认和硬件的线程数一致而不是核心数 , 可以通过调用GOMAXPROCS(-1)来获取当前逻辑Cpu数最好在main函数之前设置它,GOMAXPROCS同时也是go的环境变量之一 。
return结束当前函数,并返回指定值;runtime.Goexit结束当前goroutine,其他的goroutine不受影响,主程序也一样继续运行;os.Exit会结束当前程序,不管你三七二十一;暂停当前goroutine , 使其他goroutine先行运算 。只是暂停,不是挂起 , 当时间片轮转到该协程时,Gosched()后面的操作将自动恢复 。还没等到子协程执行,主协程就已经执行完退出了,子协程将不再执行,所以打印的全部是主协程的数据 。当然,实际上这个执行结果也是不确定的,只是大概率出现以上输出,因为主协程和子协程间并没有绝对的顺序关系 。在打印goroutine1之前,主协程调用了runtime.Gosched()方法,暂停了主协程 。子协程获得了调度,从而先行打印了goroutine2 。主协程不是一定要等其他协程执行完才会继续执行,而是一定时间 。如果这个时间内其他协程没有执行完,那么主协程将继续执行,立即终止当前协程,不会影响其它协程 , 且终止前会调用此协程声明的defer方法 。由于Goexit不是panic,所以recover捕获的error会为nil 。当main方法所在主协程调用Goexit时,Goexit不会return,所以主协程将继续等待子协程执行,当所有子协程执行完时,程序报错deadlock 。
golang调用so库同步函数停止测试动态库步骤go语言的系统暂停函数:
1、test_so.h
【go语言的系统暂停函数 go语言运行时】2、test_so.c
3、生成so
4、复制so文件到Go项目目录
Go项目目录
1、load_so.h
2、load_so.c
3、test.go
4、Go项目目录要放在$GOPATH/src/目录下go语言的系统暂停函数,这也是正常操作 。
test目录为Go项目 , 里边是上述创建go语言的系统暂停函数的所有源码文件 。
在$GOPATH/src/test/里直接使用gobuild编译生成test二进制文件,此处需要注意执行路径 。
问题
1、/**/注释go语言的系统暂停函数的代码下一行一定是import“C”,中间不能有空行

推荐阅读