#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";
}

    Source: geocities.com/siliconvalley/park/8312

               ( geocities.com/siliconvalley/park)                   ( geocities.com/siliconvalley)