I am updating Delphi (Delphi 2009) code which uses exclusively TCriticalSection.Acquire/Release pairs, not Enter/Release or Leave pairs. My question is - what is the difference between Acquire and Enter?
Delphi documentation is quite obscure - it even tries to say, that there is no difference:
Acquire: Binds the critical section to the calling thread. Call Acquire to block all other threads from acquiring this critical section until the Release or Leave method is called. Acquire does the same thing as the Enter method.
Enter: Blocks other threads when the calling thread enters a thread-sensitive section. Call Enter to block all other threads from entering code protected by this critical section until the Leave or Release method is called. Enter calls the Acquire method to bind the critical section to the calling thread.
I would like to have the method TryAcquire, but there is no such method, so - I am considering to replace all my calls to Acquire with TryEnter... Sleep... loop, that is bounded by the number of TryEnter calling efforts. But to be sure what will hapen, I should know the distinction between Acquire and Enter? What is this distinction? Why two different methods?
For
TCriticalSectionthere is no difference.Enteris implemented as a call toAcquire. Likewise forLeavewhich is implemented as a call toRelease.The
TryEntermethod was added after Delphi 2009. But it's just a simple wrapper around the Windows API callTryEnterCriticalSection. You can call that function directly yourself. You could, for example, use a class helper to introduceTryEnterinto the scope ofTCriticalSection.