sig
  type t
  val create : int -> CCSemaphore.t
  val get : CCSemaphore.t -> int
  val acquire : int -> CCSemaphore.t -> unit
  val release : int -> CCSemaphore.t -> unit
  val with_acquire : n:int -> CCSemaphore.t -> f:(unit -> 'a) -> 'a
  val wait_until_at_least : n:int -> CCSemaphore.t -> f:(unit -> 'a) -> 'a
end