Channel Synchronization in Pascal
Our example demonstrates how to synchronize execution across threads using a simple channel-like mechanism. In Pascal, we’ll use a boolean variable and a semaphore to achieve similar functionality.
program ChannelSynchronization;
uses
SysUtils, SyncObjs;
var
Done: Boolean;
Semaphore: TSemaphore;
procedure Worker;
begin
Write('working...');
Sleep(1000); // Simulate work by sleeping for 1 second
WriteLn('done');
// Signal that we're done
Done := True;
Semaphore.Release;
end;
begin
Done := False;
Semaphore := TSemaphore.Create(nil, 0, 1, '');
try
// Start a worker thread
TThread.CreateAnonymousThread(Worker).Start;
// Wait for the worker to finish
Semaphore.Acquire;
// At this point, we know the worker has finished
finally
Semaphore.Free;
end;
end.
In this Pascal version:
We define a global
Done
boolean variable and aSemaphore
to synchronize between threads.The
Worker
procedure simulates work by printing a message, sleeping for a second, and then signaling completion by settingDone
toTrue
and releasing the semaphore.In the main program, we create the semaphore and start an anonymous thread that runs the
Worker
procedure.We then wait for the worker to finish by acquiring the semaphore. This blocks until the worker releases it.
After the semaphore is acquired, we know the worker has finished its task.
To run this program:
$ fpc channel_synchronization.pas
$ ./channel_synchronization
working...done
If you removed the Semaphore.Acquire
line from this program, it would exit before the worker thread even started its work.
This example demonstrates a basic form of thread synchronization in Pascal. For more complex scenarios involving multiple threads, you might want to explore other synchronization primitives provided by the SyncObjs
unit or consider using a thread pool.