Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Semaphore for CMD instances working in Parallel

I have .bat that would be started X times (with different arguments) at the same moment. I would like them to modify one specific file but it has to be done in sequence with controllable delay. Ideally I would need mechanism that would allow only one bat to lock the file and process it as long as it's needed than release it allowing same thing for another process.

like image 308
user2395585 Avatar asked Dec 21 '22 05:12

user2395585


1 Answers

A few improvements to jeb's answer.

There is no need for an extra lock file. The queue.txt file can serve as its own lock.

Also, the innermost block must be guaranteed to exit with SUCCESS (errorlevel 0) so that the retry only occurs when the redirection failed. (CALL ) (note the trailing space) is a totally non-intuitive, yet extremely efficient way to clear any error. Not needed here, but (CALL) (note the lack of space) is an efficient way to set an error.

:lockedAppend
2>nul (
  >>queue.txt (
    REM Do any amount of processing within this block.
    REM All stdout will safely be appended to the queue
    REM You could even call out to a subroutine, or another batch file

    echo Any text you want

    REM The CALL below ensures that the block exits with ERRORLEVEL 0 - success
    (call )
  )
)||goto :lockedAppend
like image 174
dbenham Avatar answered Jan 06 '23 10:01

dbenham