sig
  type t
  val invariant : Thread_pool.t -> unit
  val create : max_num_threads:int -> Thread_pool.t Core.Std.Or_error.t
  val finished_with : Thread_pool.t -> unit Core.Std.Or_error.t
  val max_num_threads : Thread_pool.t -> int
  val num_threads : Thread_pool.t -> int
  module Work_group :
    sig type t val sexp_of_t : Thread_pool.Work_group.t -> Sexplib.Sexp.t end
  val create_work_group :
    ?min_assignable_threads:int ->
    ?max_assigned_threads:int ->
    Thread_pool.t -> Thread_pool.Work_group.t Core.Std.Or_error.t
  val add_work_for_group :
    ?name:string ->
    Thread_pool.t ->
    Thread_pool.Work_group.t -> (unit -> unit) -> unit Core.Std.Or_error.t
  val finished_with_work_group :
    Thread_pool.t -> Thread_pool.Work_group.t -> unit Core.Std.Or_error.t
  module Helper_thread : sig type t end
  val create_helper_thread :
    ?name:string ->
    Thread_pool.t ->
    Thread_pool.Work_group.t ->
    Thread_pool.Helper_thread.t Core.Std.Or_error.t
  val add_work_for_helper_thread :
    ?name:string ->
    Thread_pool.t ->
    Thread_pool.Helper_thread.t -> (unit -> unit) -> unit Core.Std.Or_error.t
  val finished_with_helper_thread :
    Thread_pool.t -> Thread_pool.Helper_thread.t -> unit Core.Std.Or_error.t
  val sexp_of_t : Thread_pool.t -> Sexplib.Sexp.t
  val ounit_tests : unit -> OUnit.test
end