Critical Section - Application Level Critical Sections

Application Level Critical Sections

Application-level critical sections reside in the memory range of the process and are usually modifiable by the process itself. This is called a user-space object because the program run by the user (as opposed to the kernel) can modify and interact with the object. However, the functions called may jump to kernel-space code to register the user-space object with the kernel.

Example Code For Critical Sections with POSIX pthread library

/* Sample C/C++, Unix/Linux */ #include /* This is the critical section object (statically allocated). */ static pthread_mutex_t cs_mutex = PTHREAD_MUTEX_INITIALIZER; void f { /* Enter the critical section -- other threads are locked out */ pthread_mutex_lock( &cs_mutex ); /* Do some thread-safe processing! */ /*Leave the critical section -- other threads can now pthread_mutex_lock */ pthread_mutex_unlock( &cs_mutex ); } int main { f; return 0; }

Example Code For Critical Sections with Win32 API

/* Sample C/C++, Windows, link to kernel32.dll */ #include static CRITICAL_SECTION cs; /* This is the critical section object -- once initialized, it cannot be moved in memory */ /* If you program in OOP, declare this as a non-static member in your class */ void f { /* Enter the critical section -- other threads are locked out */ EnterCriticalSection(&cs); /* Do some thread-safe processing! */ /* Leave the critical section -- other threads can now EnterCriticalSection */ LeaveCriticalSection(&cs); } int main { /* Initialize the critical section before entering multi-threaded context. */ InitializeCriticalSection(&cs); f; /* Release system object when all finished -- usually at the end of the cleanup code */ DeleteCriticalSection(&cs); return 0; }

Note that on Windows NT (not 9x/ME), the function TryEnterCriticalSection can be used to attempt to enter the critical section. This function returns immediately so that the thread can do other things if it fails to enter the critical section (usually due to another thread having locked it). With the pthreads library, the equivalent function is pthread_mutex_trylock. Note that the use of a CriticalSection is not the same as a Win32 Mutex, which is an object used for inter-process synchronization. A Win32 CriticalSection is for intra-process synchronization (and is much faster regarding lock times), however it cannot be shared across processes.

Read more about this topic:  Critical Section

Famous quotes containing the words application, level, critical and/or sections:

    “Five o’clock tea” is a phrase our “rude forefathers,” even of the last generation, would scarcely have understood, so completely is it a thing of to-day; and yet, so rapid is the March of the Mind, it has already risen into a national institution, and rivals, in its universal application to all ranks and ages, and as a specific for “all the ills that flesh is heir to,” the glorious Magna Charta.
    Lewis Carroll [Charles Lutwidge Dodgson] (1832–1898)

    The truth is, that common-sense, or thought as it first emerges above the level of the narrowly practical, is deeply imbued with that bad logical quality to which the epithet metaphysical is commonly applied; and nothing can clear it up but a severe course of logic.
    Charles Sanders Peirce (1839–1914)

    Post-modernism has cut off the present from all futures. The daily media add to this by cutting off the past. Which means that critical opinion is often orphaned in the present.
    John Berger (b. 1926)

    That we can come here today and in the presence of thousands and tens of thousands of the survivors of the gallant army of Northern Virginia and their descendants, establish such an enduring monument by their hospitable welcome and acclaim, is conclusive proof of the uniting of the sections, and a universal confession that all that was done was well done, that the battle had to be fought, that the sections had to be tried, but that in the end, the result has inured to the common benefit of all.
    William Howard Taft (1857–1930)