Package sem provides a way to use System V semaphores.
package mainimport ("fmt""github.com/hslam/ftok""github.com/hslam/sem""time")funcmain() {key,err:=ftok.Ftok("/tmp",0x22)iferr!=nil {panic(err)}nsems:=1semid,err:=sem.Get(key,nsems,0666)iferr!=nil {semid,err=sem.Get(key,nsems,sem.IPC_CREAT|sem.IPC_EXCL|0666)iferr!=nil {panic(err)}defersem.Remove(semid)forsemnum:=0;semnum<nsems;semnum++ {_,err:=sem.SetValue(semid,semnum,1)iferr!=nil {panic(err)}}}semnum:=0ifcount,err:=sem.GetValue(semid,semnum);err!=nil {panic(err)}elseifcount==0 {fmt.Printf("%s semnum %d wait\n",time.Now().Format("15:04:05"),semnum)}ok,err:=sem.P(semid,semnum,sem.SEM_UNDO)iferr!=nil {panic(err)}fmt.Printf("%s semnum %d P %t\n",time.Now().Format("15:04:05"),semnum,ok)time.Sleep(time.Second*10)ok,err=sem.V(semid,semnum,sem.SEM_UNDO)iferr!=nil {panic(err)}fmt.Printf("%s semnum %d V %t\n",time.Now().Format("15:04:05"),semnum,ok)time.Sleep(time.Second*20)}
In another terminal.
sem was written by Meng Huang.