Перестаёт работать чтение из файла и вычисление в потоке

Я делаю программу многопоточного вычисления выборочной дисперсии (каждая отдельная операция - умножение, сложение и т.п. должна выполняться в отдельном потоке). Синхронизация посредством условных переменных pthred_cond_t, обмен данными через файлы.

В один и тот же момент формула перестаёт вычисляться - на вычислении квадрата числа. Поток умножения будто просто не срабатывает и в результате выводится 0. Пробовал добавлять printf в каждый поток, проверить, срабатывает он или нет, и он действительно не выполняется (к тому же ещё и подсчёт ломается, цифры неправильные выходят).

В чём может быть проблема?

Пример функции потока (остальные аналогичные):

void *sum() {
    pthread_mutex_lock(&mutex);

    while (op != '+')
    {
        pthread_cond_wait(&cond, &mutex);
    }

    do_operation('+');
    pthread_mutex_unlock(&mutex);
    usleep(1000);
}

Функция для выполнения операции:

void do_operation(char operation) {
    double buf[2];
    double result;
    size_t size;
    int file = open("./file.txt", O_RDONLY);
    size = read(file, &(buf[0]), sizeof(double));
    size = read(file, &(buf[1]), sizeof(double));
    
    switch (operation) {
        case '+':
            result = buf[0] + buf[1];
            break;
        case '-':
            result = buf[0] - buf[1];
            break;
        case '*':
            result = buf[0] * buf[1];
            break;
        case '/':
            result = buf[0] / buf[1];
            break;
    }

    file = open("./file.txt", O_WRONLY);
    size = write(file, &result, sizeof(double));
    close(file);
}

main:

int main() {
    pthread_cond_init(&cond, NULL);
    pthread_mutex_init(&mutex, NULL);

    pthread_mutex_lock(&mutex);

    pthread_t sum_thread, sub_thread, mul_thread, divide_thread;
    pthread_create(&sum_thread, NULL, &sum, NULL);
    pthread_create(&sub_thread, NULL, &sub, NULL);
    pthread_create(&mul_thread, NULL, &mul, NULL);
    pthread_create(&divide_thread, NULL, &divide, NULL);

    double x[3];
    printf("x1 = ");
    scanf("%lf", &(x[0]));
    printf("x2 = ");
    scanf("%lf", &(x[1]));
    printf("x3 = ");
    scanf("%lf", &(x[2]));

    double x_mean = 0, x_temp = 0, d = 0;
    int i;
    
    op = '+';

    for (i = 0; i < 3; i++) {
        write_arguments(x[i], x_mean);
        pthread_cond_broadcast(&cond);
        pthread_mutex_unlock(&mutex);
        usleep(1000);
        pthread_mutex_lock(&mutex);
        x_mean += read_result();
        printf("x_mean sum = %f\n", x_mean);
    }

    op = '/';
    write_arguments(x_mean, 3.0);
    pthread_cond_broadcast(&cond);
    pthread_mutex_unlock(&mutex);
    usleep(1000);
    pthread_mutex_lock(&mutex);
    x_mean = read_result();
    printf("x_mean = %f\n\n\n", x_mean);

    for (i = 0; i < 3; i++) {
        op = '-';
        write_arguments(x[i], x_mean);
        printf("x%d = %f\n", i + 1, x[i]);
        printf("x_mean = %f\n", x_mean);
        pthread_cond_broadcast(&cond);
        pthread_mutex_unlock(&mutex);
        usleep(1000);
        pthread_mutex_lock(&mutex);
        x_temp = read_result();
        printf("x_temp = %f\n", x_temp);
        op = '*';
        write_arguments(x_temp, x_temp);
        pthread_cond_broadcast(&cond);
        pthread_mutex_unlock(&mutex); // Примерно с этого момента всё ломается на первой же итерации.
        usleep(1000);
        pthread_mutex_lock(&mutex); 
        x_temp = read_result(); 
        printf("x sq = %f\n\n", d); // Здесь уже выводится 0.
        op = '+';
        write_arguments(d, x_temp);
        pthread_cond_broadcast(&cond);
        pthread_mutex_unlock(&mutex);
        usleep(1000);
        pthread_mutex_lock(&mutex);
        d = read_result();
        printf("d sum = %f\n\n", d);
    }

    printf("d = %f\n", d);
    
    op = '/';
    write_arguments(d, 2.0);
    pthread_cond_broadcast(&cond);
    pthread_mutex_unlock(&mutex);
    usleep(1000);
    pthread_mutex_lock(&mutex);
    d = read_result();

    printf("d = %f\n", d);

    pthread_cond_destroy(&cond);
    pthread_mutex_destroy(&mutex);
}

Что выводится в консоль:

Вывод программы


Ответы (0 шт):