6

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.

Jason Plank
  • 2,336
  • 5
  • 31
  • 40
Graza
  • 5,010
  • 6
  • 32
  • 37

3 Answers3

12

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

Uwe Raabe
  • 45,288
  • 3
  • 82
  • 130
5

Have a look at this tutorial. Threading the Delphi Way

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

Steve
  • 6,382
  • 3
  • 41
  • 66
  • Awesome Link. Could have used this when I was doing more in Delphi a few years ago! – JamesSugrue Nov 19 '08 at 17:20
  • The original link appears dead - I think it was the same as this [article by Martin Harvey](https://nickhodges.com/MultiThreadingInDelphi/ToC.html) – Gary Walker Feb 17 '23 at 14:26
2

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
  • 7,808
  • 3
  • 43
  • 62
  • 1
    That is not what the OP is wanting, as LockList() locks the list for exclusive access - parallel read access is therefore impossible. – mghie Dec 01 '08 at 08:33
  • 2
    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 Dec 01 '08 at 16:37