Using Semaphore Objects

In the following example, a process uses a semaphore object to limit the number of windows it creates. First, it uses the CreateSemaphore function to create the semaphore and to specify initial and maximum counts.

HANDLE hSemaphore;

LONG cMax = 10;

LONG cPreviousCount;

// Create a semaphore with initial and max. counts of 10.

hSemaphore = CreateSemaphore(

NULL, // no security attributes

cMax, // initial count

cMax, // maximum count

NULL); // unnamed semaphore

if (hSemaphore == NULL)

{

// Check for error.

}

Before any thread of the process creates a new window, it uses the WaitForSingleObject function to determine whether the semaphore's current count permits the creation of additional windows. The wait function's time-out parameter is set to zero, so the function returns immediately if the semaphore is nonsignaled.

DWORD dwWaitResult;

// Try to enter the semaphore gate.

dwWaitResult = WaitForSingleObject(

hSemaphore, // handle of semaphore

0L); // zero-second time-out interval

switch (dwWaitResult) {

// The semaphore object was signaled.

case WAIT_OBJECT_0:

// OK to open another window.

break;

// Semaphore was nonsignaled, so a time-out occurred.

case WAIT_TIMEOUT:

// Cannot open another window.

break;

}

When a thread closes a window, it uses the ReleaseSemaphore function to increment the semaphore's count.

// Increment the count of the semaphore.

if (!ReleaseSemaphore(

hSemaphore, // handle of semaphore

1, // increase count by one

NULL) ) // not interested in previous count

{

// Deal with the error.

}