Quantcast
Viewing latest article 3
Browse Latest Browse All 3

Win32 Critical Section vs Mutex Performance

I wrote a small program to compare the performance of Critical Section vs Mutex in Windows.

On the tests I ran, acquiring Critical Section seems to be Slower :O Can anybody explain why both things take almost the same amount of time, and what is happening internally.

This is the timer I used - http://cplus.about.com/od/howtodothingsi2/a/timing.htm

#include "stdafx.h"#include<iostream>#include<vector>#include "h_timer.h"#include<WinBase.h>#include<Windows.h>#include<stdio.h>#define MAX_THREADS 2000  //Comment and Uncomment this to enable/disable critialSection / Mutex#define CRIT 1using namespace std;HANDLE Mutex;CRITICAL_SECTION critSection;DWORD WINAPI Contention( LPVOID );int main( void ){    HANDLE Thread[MAX_THREADS];    DWORD ThreadID;    int i;#ifdef CRIT//create a critical sectionInitializeCriticalSection(&critSection);#else    // Create a mutex with no initial owner    Mutex = CreateMutex( NULL, FALSE,NULL);#endif    // Create worker threadsCStopWatch timer, tempTimer;timer.startTimer();    for( i=0; i < MAX_THREADS; i++ )    {        Thread[i] = CreateThread( NULL,                     0,(LPTHREAD_START_ROUTINE)Contention,NULL,0,&ThreadID);    }    WaitForMultipleObjects(MAX_THREADS, Thread, TRUE, INFINITE);    timer.stopTimer();    cout<<endl<<"Elapsed Time:"<<timer.getElapsedTime();    cin.get();    // Close thread and mutex handles    for( i=0; i < MAX_THREADS; i++ )    CloseHandle(Thread[i]);    CloseHandle(Mutex);    return 0;}DWORD WINAPI Contention( LPVOID lpParam ){    #ifdef CRITEnterCriticalSection(&critSection);//printf("ThreadId: %d\n",GetCurrentThreadId());//printf("Let's try Again. %d\n\n", GetCurrentThreadId());LeaveCriticalSection(&critSection);#else// lpParam not used in this example    UNREFERENCED_PARAMETER(lpParam);    DWORD dwCount=0, dwWaitResult;    // Request ownership of mutex.    dwWaitResult = WaitForSingleObject(            ghMutex, // handle to mutex            INFINITE); // no time-out interval        dwCount++;    ReleaseMutex(ghMutex);#endifreturn TRUE;}

For 2000 threads, on a Quad Core HPZ210, both take roughly 1.5 secs.


Viewing latest article 3
Browse Latest Browse All 3

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>