how does system determine when to enter the thread function when using mutex
Following is a sample code I got from the MSDN help on using the mutex with
multiple threads. I can't figure out how the operating system decides when
the break out of the thread function to allow entry for another thread. It
doesn't appear to be under the control of the code. Is that something the
system determines? based on time slice, perhaps?
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#define THREADCOUNT 2
HANDLE ghMutex;
DWORD WINAPI WriteToDatabase( LPVOID );
void main()
{
HANDLE aThread[THREADCOUNT];
DWORD ThreadID;
int i;
// Create a mutex with no initial owner
ghMutex = CreateMutex(
NULL, // default security attributes
FALSE, // initially not owned
NULL); // unnamed mutex
if (ghMutex == NULL)
{
printf("CreateMutex error: %d\n", GetLastError());
return;
}
// Create worker threads
for( i=0; i < THREADCOUNT; i++ )
{
aThread[i] = CreateThread(
NULL, // default security attributes
0, // default stack size
(LPTHREAD_START_ROUTINE) WriteToDatabase,
NULL, // no thread function arguments
0, // default creation flags
&ThreadID); // receive thread identifier
if( aThread[i] == NULL )
{
printf("CreateThread error: %d\n", GetLastError());
return;
}
}
// Wait for all threads to terminate
WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE);
// Close thread and mutex handles
for( i=0; i < THREADCOUNT; i++ )
CloseHandle(aThread[i]);
CloseHandle(ghMutex);
}
DWORD WINAPI WriteToDatabase( LPVOID lpParam )
{
DWORD dwCount=0, dwWaitResult;
printf("%d*********************\n", GetCurrentThreadId());
// Request ownership of mutex.
while( dwCount < 20 )
{
printf("%d dwCount = %d\n", GetCurrentThreadId(), (int)dwCount);
printf("%d ...wait...\n", GetCurrentThreadId());
dwWaitResult = WaitForSingleObject(
ghMutex, // handle to mutex
INFINITE); // no time-out interval
printf("%d ---switch---\n", GetCurrentThreadId());
switch (dwWaitResult)
{
// The thread got ownership of the mutex
case WAIT_OBJECT_0:
__try {
// TODO: Write to the database
printf("%d writing to database...\n",
GetCurrentThreadId());
dwCount++;
}
__finally {
// Release ownership of the mutex object
if (! ReleaseMutex(ghMutex))
{
// Deal with error.
}
printf("%d xxxreleasexxx\n", GetCurrentThreadId());
}
break;
// The thread got ownership of an abandoned mutex
case WAIT_ABANDONED:
printf("%dWAIT_ABANDONED------------\n", GetCurrentThreadId());
return FALSE;
}
}
printf("%d----------------------\n", GetCurrentThreadId());
return TRUE;
}