Para Windows, las secciones críticas son más livianas que las mutex.
Los mutexes se pueden compartir entre procesos, pero siempre dan como resultado una llamada al kernel que tiene una sobrecarga.
Las secciones críticas solo se pueden usar en un proceso, pero tienen la ventaja de que solo cambian al modo kernel en caso de desacuerdo: las adquisiciones imprevistas, que deberían ser el caso común, son increíblemente rápidas. En el caso de contención, ingresan al kernel para esperar en alguna primitiva de sincronización (como un evento o semáforo).
Escribí una aplicación de muestra rápida que compara el tiempo entre los dos. En mi sistema para 1,000,000 adquisiciones y liberaciones no aprobadas, un mutex toma más de un segundo. Una sección crítica requiere ~ 50 ms para 1,000,000 adquiere.
Aquí está el código de prueba, ejecuté esto y obtuve resultados similares si mutex es el primero o el segundo, por lo que no estamos viendo ningún otro efecto.
HANDLE mutex = CreateMutex(NULL, FALSE, NULL);
CRITICAL_SECTION critSec;
InitializeCriticalSection(&critSec);
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
LARGE_INTEGER start, end;
// Force code into memory, so we don't see any effects of paging.
EnterCriticalSection(&critSec);
LeaveCriticalSection(&critSec);
QueryPerformanceCounter(&start);
for (int i = 0; i < 1000000; i++)
{
EnterCriticalSection(&critSec);
LeaveCriticalSection(&critSec);
}
QueryPerformanceCounter(&end);
int totalTimeCS = (int)((end.QuadPart - start.QuadPart) * 1000/freq.QuadPart);
// Force code into memory, so we don't see any effects of paging.
WaitForSingleObject(mutex, INFINITE);
ReleaseMutex(mutex);
QueryPerformanceCounter(&start);
for (int i = 0; i < 1000000; i++)
{
WaitForSingleObject(mutex, INFINITE);
ReleaseMutex(mutex);
}
QueryPerformanceCounter(&end);
int totalTime = (int)((end.QuadPart - start.QuadPart) * 1000/freq.QuadPart);
printf("Mutex: %d CritSec: %d\n", totalTime, totalTimeCS);
¿Por qué en la tierra está etiquetado 'language-agnostic' * y *' C# '? – Puppy
Buena lectura para la persona que comentó y, posiblemente, las 5 personas que votaron a favor si tenían suficientes representantes: http://blogs.msdn.com/b/oldnewthing/archive/2012/10/17/10360184.aspx –
Awesome link @ BrianR.Bondy gracias. – Wodzu