pthread mutex no funciona correctamente

Actualmente estoy aprendiendo C del curso Open Courseware del MIT llamado Programación práctica en C. Al analizar las condiciones de carrera en subprocesos múltiples, las notas de la conferencia contenían un ejemplo de un programa con una condición de carrera y cómo se podría resolver usando un mutex. El código funciona como se esperaba en los sistemas Linux, pero no en OS X.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t mutex; // Added to fix race condition
unsigned int cnt = 0;

void *count(void *arg) {
    int i;
    for (i = 0; i < 100000000; i++) {
        pthread_mutex_lock(&mutex); // Added to fix race condition
        cnt++;
        pthread_mutex_unlock(&mutex); // Added to fix race condition
    }
    return NULL;
}

int main() {
    pthread_t tids[4];
    int i;
    for (i = 0; i < 4; i++)
        pthread_create(&tids[i], NULL, count, NULL);
    for (i = 0; i < 4; i++)
        pthread_join(tids[i], NULL);
    pthread_mutex_destroy(&mutex); // Added to fix race condition
    printf("cnt = %u\n", cnt);
    return 0;
}

Antes de agregar el mutex y las llamadas de función correspondientes, el comportamiento fue el esperado, produciendo una fracción variable de la respuesta idealmente correcta para cnt (400000000), diferente en cada ejecución. Después de agregar el mutex, esto todavía sucedía, aunque hubo un aumento obvio en los resultados, lo que sugiere que teníaalgunos&nbsp;del efecto esperado, pero lejos de ser perfecto.

Intenté compilar este programa en otras 3 computadoras / VM: una con OS X 10.10 (la primera con 10.11), otra con Kali Linux (esencialmente Debian Jessie bajo el capó) y otra con Ubuntu. Las dos ejecuciones de OS X mostraron el mismo comportamiento extraño que el descrito. Sin embargo, ambos sistemas Linux produjeron el 400000000 perfecto como se esperaba.

Entonces mi pregunta es, ¿por qué el mutex no funciona como se esperaba en OS X?