You can use directory names, queue names (see also Using REXX queues to simulate a semaphore) or file names (see Using a file as semaphore) as semaphores in REXX (Note that the REXXUTIL DLL released with Object-Oriented REXX contains functions allowing use of normal OS/2 semaphores in REXX programs):
1. Using a directory name
/* example code to show how to use a directory name as semaphore in */
/* REXX. Note that this algorithm assumes that the program also */
/* frees the semaphore in case of a crash ! */
semName = "C:\TEMP\MYSEM"
/* test and set the semaphore */
do until rc = 0
/* note: in a real program you should */
/* also check for a timeout! */
"@md " semName "1>NUL 2>NUL"
end /* do until rc = 0 */
/* semaphore set -- now it's our turn */
/* to do something */
/* ... */
/* free the semaphore */
"@rd " semName "1>NUL 2>NUL"
exit 0
2. Using a Queue name
/* example code to show how to use a queue name as semaphore in */
/* REXX. Note that this algorithm assumes that the program also */
/* frees the semaphore in case of an crash! */
semName = "MYSEM"
/* test and set the semaphore */
do until uniqueName == semName
/* note: in a real program you should */
/* also check for a timeout! */
uniqueName = rxqueue( "create", semName )
if uniqueName <> semName then
do
/* queue already exists -- delete the */
/* new created queue! */
call rxqueue "delete", uniqueName
end /* if uniqueName <> semName then */
end /* do until uniqueName == semName */
/* semaphore set -- now it's our turn */
/* to do something */
/* ... */
/* free the semaphore */
call rxqueue 'Delete', semName
exit 0