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
Doneboolean variable and aSemaphoreto synchronize between threads.The
Workerprocedure simulates work by printing a message, sleeping for a second, and then signaling completion by settingDonetoTrueand releasing the semaphore.In the main program, we create the semaphore and start an anonymous thread that runs the
Workerprocedure.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...doneIf 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.