The Interlocked Functions Program Example 3
The next program demonstrates how mutual exclusion can be achieved by using the InterlockedIncrement() and the InterlockedDecrement() functions. The code makes sure that only one thread is executing the critical section of code at any time. The problem is that the threads may become starved. A starved thread is one in which there is no guarantee that the thread will actually enter the critical section, just waiting, hence cannot complete its task.
Create a new empty Win32 console application project. Give a suitable project name and change the project location if needed.
Then, add the source file and give it a suitable name.
Next, add the following source code.
// Example demonstrating the mutual exclusion (MutEx)
#include <windows.h>
#include <stdio.h>
// Global variable, no need for volatile
LONG TotalThreadCount = 0;
///// Thread Main ///////
void ThreadMain(char *threadName)
{
DWORD i;
// Let give some limit...
for(i = 0;i < 10;i++)
{
while( InterlockedIncrement((LPLONG)&TotalThreadCount) !=1 )
{
InterlockedDecrement((LPLONG)&TotalThreadCount);
}
// Critical section code should be here
wprintf(L%S, in critical section, doing my task...\n, threadName);
// May give some time to simulate the task need to be completed
Sleep(1000);
// Critical section ends
InterlockedDecrement((LPLONG)&TotalThreadCount);
}
}
/////////// Create A Child //////////////
void CreateChildThread(char *name)
{
HANDLE hThread;
DWORD dwId;
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadMain,(LPVOID)name,0,&dwId);
if(hThread != NULL)
wprintf(LCreateThread() is OK, thread id is %u\n, dwId);
else
wprintf(LCreateThread() failed, error %u\n, GetLastError());
if(CloseHandle(hThread) != 0)
wprintf(LhThread handle closed successfully!\n);
else
wprintf(LFailed to close hThread handle, error %u\n, GetLastError());
wprintf(L\n);
}
//////////////////// Main ///////////////////////
int wmain(void)
{
CreateChildThread(ThreadBodoA);
CreateChildThread(ThreadBodoB);
CreateChildThread(ThreadBodoC);
CreateChildThread(ThreadBodoD);
ExitThread(0);
return 0;
}
Build and run the project. The following screenshot is a sample output.