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.
You should have a look at the TMultiReadExclusiveWriteSynchronizer class declared in sysutils.pas...
Have a look at this tutorial. Threading the Delphi Way
Look at Chapter 11, but it's all good stuff.
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.
来源:https://stackoverflow.com/questions/302583/how-can-i-implement-a-thread-safe-list-wrapper-in-delphi