add semaphore.go