[fpc-pascal] getting started with threads
darekm at emadar.com
Fri Sep 18 16:24:22 CEST 2009
David Emerson pisze:
> I am getting started with threads (linux/cthreads) and I'm very happy so
> far, but unsure of the best way to tackle my situation.
> I have a program that needs to perform about 10,000 independent tasks,
> which usually involve waiting for I/O; thus it makes sense to use
> several threads so that some waiting can be done in parallel. I thought
> I'd try it with 10 threads.
> When a thread completes its task, I'd like it to simply request a new
> task from the queue. The best way I could think to do this was to have
> a task assignment function (which accesses a global variable and
> returns a task id, marking it as pending.)
> But how can I prevent race conditions? If threads X and Y happen to call
> the task assignment function at the same time, it seems to me that they
> could both be assigned to the same task. I know that this is a problem
> which has been addressed at great length in the computer science
> world ... so what's the easiest way for me to address it here and now?
> While writing this message it dawned on me that I probably need an event
> loop (I'm writing a console app) which will, e.g., sleep for 1 second
> and then check on the status of each thread's work. Then the main loop
> can assign a new task by starting a new thread, whenever it finds one
> that is finished. That puts the assignment task back in the main loop
> where there is no race condition.
You need FIFO queue for multiple consumer. Each task can be assigned to
You can use ordinal tThreadList but it rather slow.
I use own lockfree FIFO http://www.emadar.com/fpc/lockfree.htm to
distribute task between threads
its much faster and well scaling on multicore.
More information about the fpc-pascal