import Ġarrow . fx . coroutines . par Tra verse Ċ import Ġkotlin . time . Duration . Companion . seconds Ċ import Ġkotlinx . coroutines . sync . Semaphore Ċ import Ġpre def . Console Ċ import Ġpre def . Temporal Ċ Ċ /** Ċ Ġ* ĠGeneral ize Ġthe Ġprevious Ġsolution Ġso Ġthat Ġit Ġallows Ġmultiple Ġthreads Ġto Ġrun Ġin Ġthe Ġcritical Ċ Ġ* Ġsection Ġat Ġthe Ġsame Ġtime , Ġbut Ġit Ġen forces Ġan Ġupper Ġlimit Ġon Ġthe Ġnumber Ġof Ġconcurrent Ġthreads . ĠIn Ċ Ġ* Ġother Ġwords , Ġno Ġmore Ġthan Ġn Ġthreads Ġcan Ġrun Ġin Ġthe Ġcritical Ġsection Ġat Ġthe Ġsame Ġtime . ĠThis Ċ Ġ* Ġpattern Ġis Ġcalled Ġa Ġmultip lex . Ċ Ġ*/ Ċ suspend Ġfun Ġmultip lex (): ĠUnit Ġ{ ĊĠ Ġval Ġs Ġ= ĠSem aphore ( 2 ) ĊĠ Ġ( 1 .. 6 ). par Tra verse Ġ{ Ġcount Ġ-> ĊĠĠĠ ĠPrec ious Resource (" R $ count ", Ġs ). use () ĊĠ Ġ} Ċ } Ċ Ċ class ĠPrec ious Resource ( ĊĠ Ġval Ġname : ĠString , ĊĠ Ġval Ġs : ĠSem aphore , ĊĠ Ġconsole : ĠConsole Ġ= ĠConsole . Default , ĊĠ Ġtemporal : ĠTemp oral Ġ= ĠTemp oral . Default Ċ ) Ġ: ĠConsole Ġby Ġconsole , ĠTemp oral Ġby Ġtemporal Ġ{ ĊĊĠ Ġsuspend Ġfun Ġuse (): ĠUnit Ġ{ ĊĠĠĠ Ġval Ġx Ġ= Ġs . available Permit s ĊĠĠĠ Ġput Str ("$ name Ġ>> ĠAvailability : Ġ$ x ") ĊĠĠĠ Ġs . acquire () ĊĠĠĠ Ġval Ġy Ġ= Ġs . available Permit s ĊĠĠĠ Ġput Str ("$ name Ġ>> ĠStarted Ġ| ĠAvailability : Ġ$ y ") ĊĠĠĠ Ġsleep ( 3 . seconds ) ĊĠĠĠ Ġs . release () ĊĠĠĠ Ġval Ġz Ġ= Ġs . available Permit s ĊĠĠĠ Ġput Str ("$ name Ġ>> ĠDone Ġ| ĠAvailability : Ġ$ z ") ĊĠ Ġ} Ċ } Ċ