pthread мьютекс не работает правильно

В настоящее время я изучаю язык C из открытого курса MIT под названием «Практическое программирование на языке C.» При обсуждении условий гонки в многопоточности в лекционных заметках содержался пример программы с условием гонки и способы ее решения с использованием мьютекса. Код работает, как и ожидалось, в системах Linux, но не в 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;
}

Перед добавлением мьютекса и соответствующих вызовов функций поведение было таким, как ожидалось, создавая переменную долю идеально правильного ответа для cnt (400000000), различную при каждом запуске. После добавления мьютекса это все еще происходило, хотя результаты явно увеличивались, что свидетельствует онемного ожидаемого эффекта, но далеко не идеально.

Я попытался скомпилировать эту программу на 3 других компьютерах / виртуальных машинах: один с OS X 10.10 (первый работал с 10.11), другой с Kali Linux (по сути, с Debian Jessie под капотом) и один с Ubuntu. Оба запуска OS X показали то же самое странное поведение, как описано. Тем не менее, обе системы Linux дали идеальные 400000000, как и ожидалось.

Итак, мой вопрос: почему мьютекс не работает должным образом на OS X?

Ответы на вопрос(2)

Ваш ответ на вопрос