Перестаёт работать чтение из файла и вычисление в потоке
Я делаю программу многопоточного вычисления выборочной дисперсии (каждая отдельная операция - умножение, сложение и т.п. должна выполняться в отдельном потоке). Синхронизация посредством условных переменных 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(÷_thread, NULL, ÷, 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);
}
Что выводится в консоль:
