views:

758

answers:

3

I have a list wrapper that maintains two Tstringlists and a TClassList

I need this to be thread safe, such that:

  • Concurrent writes are not allowed (wait state of some sort should be entered)
  • Reading while writing (or vice versa) is not allowed (wait state of some sort should be entered)
  • Concurrent reads are allowed

Any ideas on how I can do this? My instinct tells me it needs more than just a critical section, perhaps a semaphore or "usage counter", perhaps one of these in conjunction with a CS.

I'm just not quite sure where to start - anything from an overall approach in english to psuedo-code, to delphi implementation or external link would be much appreciated.

+8  A: 

You should have a look at the TMultiReadExclusiveWriteSynchronizer class declared in sysutils.pas...

Uwe Raabe
Probably the longest class name in the RTL :)
AhmetC
they could so easily have called it TMREWS
Steve
They could easily have called it TGreenIdea and conveyed as much information as TMREWS would. Don't be afraid of long identifier names.
Rob Kennedy
+3  A: 

Have a look at this tutorial. Threading the Delphi Way

Look at Chapter 11, but it's all good stuff.

Steve
Awesome Link. Could have used this when I was doing more in Delphi a few years ago!
KiwiBastard
A: 

You really should look at TThreadList.

The methods .Add, .Remove, .Clear automatically lock the list for you. If needed, you can also lock/unlock as needed:

x.LockList; 
try 
  //do whatever
finally  
  x.Unlocklist; 
end;

TMultiReadExclusiveWriteSynchronizer is a grand idea but I don't know if they ever ironed all the bugs out. It has always had issues under load.

Darian Miller
That is not what the OP is wanting, as LockList() locks the list for exclusive access - parallel read access is therefore impossible.
mghie
I was completely unaware that TThreadList even existed until now. I had been using TStringList objects with all sorts of CriticalSections in my code. This will make life much simpler!
Mick