#Create a mutex object use Win32::Mutex; sub CriticalSection { print"In Critical section @_\n"; sleep rand(4); print"Exiting Critical section @_\n"; } sub EnterArea { local( $mut ) = shift(@_); do { $result= $mut->Wait(60000); if($result) { $Error=Win32::FormatMessage Win32::GetLastError; printf( "Waiting for Mutex: Result=$result Error $Error"); } } while($result); print "Ready for access\n"; #access away!!! &CriticalSection(@_); $result=$mut->Release(); if(!$result) { $Error=Win32::FormatMessage Win32::GetLastError; printf( "Releasing Mutex: Result=$result Error $Error"); die; } } $result=Win32::Mutex::Create( $mut,0, "Mutex"); if( Win32::GetLastError) { $Error=Win32::FormatMessage Win32::GetLastError; printf("Creating Mutex: Result=$result Error $Error"); printf("Opening Mutex\n"); $result=Win32::Mutex::Open( $mut, "Mutex"); $lasterror=Win32::GetLastError; $Error=Win32::FormatMessage $lasterror; print "Opening Mutex: Result=$result $mut Error $Error"; !$lasterror || die "Error Opening Mutex $Error"; } else { printf("Created Mutex\n"); } #Use it for($i=1;$i<10;$i++) { &EnterArea($mut,$i); #print"\nPress Enter to Continue..."; sleep rand(4); #print"\n"; }