pthread mutex funktioniert nicht richtig

Ich lerne gerade C aus dem Open Courseware-Kurs des MIT mit dem Titel "Praktisches Programmieren in C". In den Vorlesungsunterlagen wurden die Race-Bedingungen im Multithreading besprochen. Sie enthielten ein Beispiel für ein Programm mit Race-Bedingungen und wie es mithilfe eines Mutex gelöst werden könnte. Der Code funktioniert erwartungsgemäß auf Linux-Systemen, jedoch nicht unter 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;
}

Vor dem Hinzufügen des Mutex und der entsprechenden Funktionsaufrufe war das Verhalten wie erwartet und führte zu einem variablen Bruchteil der ideal korrekten Antwort für cnt (400000000), der sich bei jedem Durchlauf unterscheidet. Nach dem Hinzufügen des Mutex war dies immer noch der Fall, obwohl die Ergebnisse offensichtlich zugenommen hatten, was darauf hindeutete, dassetwa des erwarteten Effekts, aber alles andere als perfekt.

Ich habe versucht, dieses Programm auf drei anderen Computern / VMs zu kompilieren: einem mit OS X 10.10 (der erste mit 10.11), einem mit Kali Linux (im Wesentlichen Debian Jessie unter der Haube) und einem mit Ubuntu. Beide OS X-Läufe zeigten dasselbe seltsame Verhalten wie beschrieben. Beide Linux-Systeme haben jedoch erwartungsgemäß die perfekte 400000000 erzeugt.

So ist meine Frage, warum der Mutex unter OS X nicht wie erwartet funktioniert?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage