Блокировка мьютекса и запись в файл

#c #pthreads #mutex

#c #pthreads #мьютекс

Вопрос:

Я пытаюсь записать некоторые данные в файл, если выполняется условие. К функции, которая содержит все это, обращаются несколько потоков.

Каждый раз, когда выполняется условие, есть четыре переменные, которые записываются «A, B, C, D». Чаще всего случается, что файл данных, в который он записывается, содержит больше переменных, чем он должен содержать в одной строке.

После небольшой отладки с помощью gdb я понял, что несколько потоков записывают одновременно, и именно поэтому я ввел блокировку мьютекса pthread.

 void Client::response(Sender* send, FILE *fp){
    pthread_mutex_lock(amp;lock);    

    if (status == ROI) {           

        if (condition) {
            RPS=serviceTime.size();
            double q90, q95, q99 = 0.0;
            std::sort(serviceTime.begin(), serviceTime.end());
            int q90 = (int)ceil(0.90 * double(RPS));
            int q95 = (int)ceil(0.95 * double(RPS));
            int q99 = (int)ceil(0.99 * double(RPS));
            q90 = serviceTime.at(Index90-1)/1e6;
            q95 = serviceTime.at(Index95-1)/1e6;
            q99 = serviceTime.at(Index99-1)/1e6;
            fprintf(fp, "%d, %.3f, %.3f, %.3fn", RPS, q90, q95, q99);
            fflush(fp);
            serviceTime.clear();
        }
    }

    pthread_mutex_unlock(amp;lock);
}
  

Чего мне здесь не хватает? почему он записывается несколько раз в один и тот же файл?

Комментарии:

1. Где это lock определено? Где fp используется, кроме как здесь? Нам нужен MCVE.

2. Высокий уровень. FP не используется нигде, кроме как здесь. Блокировка определена в классе Client. и ответ является общедоступной функцией. Работа с MCVE — сгенерирует его

3. Проверьте возвращаемое значение pthread_mutex_lock ? Нужно больше кода.. Я думаю.

4. Потоки используют несколько объектов клиентского класса или один и тот же объект? Нужен MCVE.

5. Существует ли несколько клиентских объектов или только один клиентский объект? Если есть несколько клиентов, возможно, сделайте мьютекс статическим объектом, иначе у каждого клиента будет своя блокировка, но для работы вам нужно, чтобы мьютекс работал с одной блокировкой. Кроме того, рассмотрите возможность блокировки только в том случае, если условие выполнено, т.Е. Перемещение блокировки внутри условия, если.

Ответ №1:

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

Комментарии:

1. Это не отвечает на вопрос. Ни одна из этих вещей не поможет, основываясь на деталях вопроса OP.

2. Несколько потоков записывают в один и тот же файл, я вижу условие в верхней части функции, которое выдает cond vars … Но хорошо

3. Ну, вопрос очень и очень расплывчатый, и я считаю, что решение содержится в концепциях, которые я связал. Но, пожалуйста, будьте моим гостем и найдите что-нибудь получше 🙂 Я бы подумал, что для любых одновременных операций записи в общий ресурс эти концепции являются ключевыми.

4. Конечно… Но когда наш вопрос расплывчатый, мы комментируем и спрашиваем или более подробно, а не просто отвечаем очень расплывчато. Кроме того, операционная система уже использует мьютекс, что является концепцией обеспечения эксклюзивного доступа, а не условных переменных. Кроме того, они используют pthread, который не будет работать с предоставленными вами ссылками, возможно, у них нет c 11.

5. Я согласен, что они не обязательно используют C 11 (это было бы странно в наши дни, но конечно). Что касается вашего комментария, я просто его не видел. И да, они используют мьютексы, но, по-видимому, это не работает, поэтому, возможно, более подходящий / стандартный подход к упомянутой проблеме ожидания выполнения условия для запуска параллельного фрагмента кода является хорошим указателем. Если OP не согласен, я полагаю, он может сказать это сам 🙂