golang直接操作共享内存
前一段时间使用公司内部某个依赖共享内存的组件,其go版本api通过cgo提供。抛开我是个pure go狂热分子以外,采用cgo的方式实现会存在很多问题。所以分析其源码后通过go进行重写,故在此分享一下直接通过golang去操作共享内存。
通过golang操作共享内存主要依赖了以下几个系统调用:
- SYS_SHMGET
- SYS_SHMCTL
- SYS_SHMAT
- SYS_SHMDT
操作步骤:
前一段时间使用公司内部某个依赖共享内存的组件,其go版本api通过cgo提供。抛开我是个pure go狂热分子以外,采用cgo的方式实现会存在很多问题。所以分析其源码后通过go进行重写,故在此分享一下直接通过golang去操作共享内存。
通过golang操作共享内存主要依赖了以下几个系统调用:
操作步骤:
昨天在别人发了个用golang的channel写菲波拉契数列的代码,说是有问题,然后我试着撸一个,结果发现管道阻塞状态下的一个trap,就是当主线程和子线程同时阻塞一个管道时,当管道有了数据是优先返回给主线程的.测试代码如下:
package main
import (
."fmt"
)
func fbi(num int,ch chan int){
if num<3 {
ch<-num;
}else{
/*
cl:=make(chan int);
go fbi(num-2,cl);
tmp:=<-cl;
cr:=make(chan int);
go fbi(num-1,cr);
tmp+=<-cr;
ch<-tmp;
*/
go fbi(num-2,ch);
r:=<-ch;
Println("in go");
go fbi(num-1,ch);
l:=<-ch;
ch<- (l+r);
}
}
func main(){
ch:=make(chan int);
go fbi(10,ch);
Println(<-ch);
Println("in main go");
}