<div dir="ltr"><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_extra"><div class="gmail_quote">2014-09-18 16:13 GMT+08:00 Michael Schnell <span dir="ltr"><<a href="mailto:mschnell@lumino.de" target="_blank">mschnell@lumino.de</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><br>
I did the TThreadPool class just for fun. I'll compare the two thingies and come back with some comments.<br><div class=""><div class="h5"><br></div></div></blockquote><div><br></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">​I don't quite understand the logic or difference between critical section ​</div> <div class="gmail_default" style="font-family:'courier new',monospace;display:inline">​and events. My feeling is that to do synchronization you will have to use event (I will do some test to verify that).  Because when you use critical section, like in your ThreadPool: </div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline"><br></div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">procedure TThreadPoolThread.Execute;</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">begin</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">  while not Terminated do begin</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">    Wait.Aquire;</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">    ...</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">  end;</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">end;</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline"><br></div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">You are actively try to aquire the CS.  i.e. After you finish this loop and notify the main thread, how do you ensure which thread will get this CS next? The main thread or this worker thread?</div></div><div><br></div><div><div class="gmail_default" style="font-family:'courier new',monospace">​But if you use something like this (I don't know if the syntax or usage is correct, just show my thinking):</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">procedure TThreadPoolThread.Execute;</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">begin</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">  while not Terminated do begin</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">    RTLEventWaitFor(Wait);</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">    ...</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">  end;</div></div><div><div class="gmail_default" style="font-family:'courier new',monospace;display:inline">end;</div></div><div class="gmail_default" style="font-family:'courier new',monospace">​</div><div class="gmail_default" style="font-family:'courier new',monospace">​Then, you are PASSIVELY wait for the event which will be set/reset from OUTSIDE this working thread.</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">That's what confused me how can you use a CS for the purpose of thread synchronization!</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">Yesterday I read your ThreadPool source code, and cannot understand how you control which thread can get the "Wait" CS, rather than just let the 2 thread compete for it. Could you please explain the logic behind this?</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">Thanks!</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">Xiangrong​<br></div><br></div></div></div></div>