pthread mutex não está funcionando corretamente

Atualmente, estou aprendendo C do curso Open Courseware do MIT, chamado Practical Programming in C. Ao discutir condições de corrida em multithreading, as notas da aula continham um exemplo de um programa com uma condição de corrida e como ele poderia ser resolvido usando um mutex. O código funciona conforme o esperado em sistemas Linux, mas não no 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 adicionar o mutex e as chamadas de função correspondentes, o comportamento era o esperado, produzindo uma fração variável da resposta idealmente correta para cnt (400000000), diferente em cada execução. Depois de adicionar o mutex, isso ainda estava acontecendo, embora houvesse um aumento óbvio nos resultados, sugerindo quealguns do efeito esperado, mas longe de ser perfeito.

Tentei compilar este programa em outros 3 computadores / VMs: um com o OS X 10.10 (o primeiro com o 10.11), um com o Kali Linux (essencialmente Debian Jessie) e um com o Ubuntu. As duas execuções do OS X mostraram o mesmo comportamento estranho descrito. No entanto, ambos os sistemas Linux produziram os 400000000 perfeitos, conforme o esperado.

Então, minha pergunta é: por que o mutex não funciona como esperado no OS X?

questionAnswers(2)

yourAnswerToTheQuestion