Aradeonas,
You will probably need to start using semaphores/mutexes to control
access from multiple threads if your requirement goes beyond the simple
use of critical sections. The problem starts becoming more complex if
one or more threads has to wait on the actions of another before
accessing the queue. A further complexity is that you are entering the
world of platform dependency with significant differences between
Windows and Unixes in semaphore and mutex semantics.
This is a problem I had to solve when porting the IBX TISQLMonitor class
to Lazarus. You are welcome to have a look at the solution I came up
with which hides the platform differences behind a common set of classes
that are implemented differently for each platform. These implement the
common set of objects needed to co-ordinate multiple threads accessing
common queues in the same or different processes: shared memory,
mutexes, single and multi-lock gates.
You can download the source at http://www.mwasoftware.co.uk/ibx
Regards
Tony Whyman
MWA
On 21/10/15 11:07, Aradeonas wrote:
Hi,
[Cross posted on forum so if you want answer there :
http://forum.lazarus.freepascal.org/index.php/topic,30097.0.html]
I want to make a simple and safe queue with multiple worker that do
the jobs, so for example I add 10 job and have 2 worker that do the job.
For this I read multi threading
<http://wiki.freepascal.org/Multithreaded_Application_Tutorial> and
queue <http://wiki.freepascal.org/Manager_Worker_Threads_System>wiki
and some posts like this
<http://stackoverflow.com/questions/15027726/how-to-make-a-thread-finish-its-work-before-being-freed/15033839#15033839>and
also Lazarus multi threading samples but still cant find out how to
make a good structure that really work specially when I read
<http://stackoverflow.com/questions/15622261/multi-thread-delphi>about
that it is not very good to do counting and micro-managing.
Also I dont know a good multi threading library in Lazarus like
OmniThreadLibrary and also couldn't find any good example.
For now I have a list of jobs and 2 workers and also a var that
control that when a thread finish start another for the next job but
it not do job very good and sometimes it will mess the list of jobs.
var
i: integer;
begin
try
MyCriticalSection.Enter;
for i := 0 to Count - 1 do
begin
if (StartedCount >= WorkersCount) then //check for is there need
for making new thread or not
Exit;
if (not Jobs[i].Working) and (not Jobs[i].Finished) then //check
the job is already done or not
StartJob(Jobs[i]);
end;
if (StartedCount = 0) then
Finish;//It will finish that list of jobs
finally
MyCriticalSection.Leave;
end;
Regards,
Ara
--
http://www.fastmail.com - Access all of your messages and folders
wherever you are
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus