Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1

Функция с fprintf в многопоточной программе

22.01.2017, 22:36. Показов 1601. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько я знаю, fprintf не многопоточен. Т.е. я не могу просто взять и использовать fprintf() в к-либо функции для многопоточной проги.
Какие наиболее адекватные методы синхронизации стоит использовать, на данный момент пока так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include    <stdio.h>
#include    <stdarg.h>
#include    <stdlib.h>
#include    <string.h>
#include    <time.h>
#include    <linux/limits.h>
#include <pthread.h>
.....
 
pthread_mutex_t logmutex;
.....
void    logwrite(const char *form,...)
{time_t logtime;
 time_t rawtime;
 struct tm * timeinfo;
 char timestring[80];
 
 if(logfile == NULL) return;
 if(form == NULL) return;
  
 
 pthread_mutex_lock(&logmutex);
 
 va_list ap;/*get parameters list*/
 va_start(ap, form);
 time(&logtime); /*format output log message*/
 strftime (timestring,80,"%d-%m-%G %T",localtime(&logtime));
 fprintf(logfile,"[%s] ",timestring);
 vfprintf(logfile,form,ap);
 fprintf(logfile,"\n");
 fflush(logfile);/*for logs it`s needed, slower, but more reliable */
 va_end (ap);
 
 pthread_mutex_unlock(&logmutex);
 
}
Заодно и второй вопрос (нарушаю правило один вопрос - одна тема), стоит ли доверять в организации ведения лог-файла fflush(), или тупо использовать fopen() .... запись() ..... fclose(), что намного медленнее будет(из-за тормозной fopen)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2017, 22:36
Ответы с готовыми решениями:

Метод For в многопоточной программе
Почему данный код не компилируется и как исправить ошибку? using System; using System.Threading.Tasks; class...

Ошибка в многопоточной программе
Здравствуйте! Есть простая программа, которая выдает список всех папок в заданной папке (включая вложенные) Процесс создания списка...

Назначение параметров в многопоточной программе
Ребят от чего зависит вот эти параметры в моей программе? Mythread t1 = new Mythread(&quot;Поток 1&quot;, 10, t); ...

13
191 / 151 / 61
Регистрация: 08.04.2010
Сообщений: 1,032
23.01.2017, 08:51
C
1
2
3
4
5
#include <logfile.h>
....
     openlog("logfile", LOG_PID|LOG_CONS, LOG_USER);
     syslog(LOG_INFO, "A different kind of Hello world ... ");
     closelog();
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.01.2017, 09:18
В нормальном режиме работы должно быть так, что запись данных в логе составляет лишь небольшую долю времени от работы программы (потока). В противном случае нет смысла запускать несколько потоков, т.к. всё время будет потрачено на нераспараллеливаемую запись в лог-файл. Поэтому должно быть по барабану, какой метод синхронизации использовать

Про fflush вопрос не совсем понял. Ты считаешь, что он работает не правильно или чем вызван вопрос?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
23.01.2017, 10:03
delete
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
23.01.2017, 17:53  [ТС]
Цитата Сообщение от Dovgon Посмотреть сообщение
C
1
2
3
4
5
#include <logfile.h>
....
* * *openlog("logfile", LOG_PID|LOG_CONS, LOG_USER);
* * *syslog(LOG_INFO, "A different kind of Hello world ... ");
* * *closelog();
А где оно под виндой/ДОСом?
А я вообще хочу уложиться в C89.
Цитата Сообщение от Evg Посмотреть сообщение
Про fflush вопрос не совсем понял. Ты считаешь, что он работает не правильно или чем вызван вопрос?
Просто видел решения вроде fopen()->fprint()->fclose(). fopen() тормозной, потому и возник вопрос - чем обосновано это открытие/закрытие....

По поводу синхронизации - если в многопоточной проге вылезит повторный вход на запись в лог то это будет coredump, потому и нужна синхронизация. Думаю сделать её условной компиляцией - если надо включится директивой/дефайном.
0
191 / 151 / 61
Регистрация: 08.04.2010
Сообщений: 1,032
23.01.2017, 17:58
drfaust, Ты пишешь в тему Linux.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
23.01.2017, 18:02  [ТС]
Потому как линуха в первую очередь (POSIX), уже потом на другие.

З.Ы. Чёт ничего не нашёл по реентабельности syslog(), наверное тоже придётся "оборачивать" мютексами.
0
191 / 151 / 61
Регистрация: 08.04.2010
Сообщений: 1,032
23.01.2017, 18:15
В win не ведутся лог файлы. Там есть журнал событий а с ними работать через winAPI.
https://msdn.microsoft.com/en-... s.85).aspx
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
23.01.2017, 18:18  [ТС]
Dovgon, Как ни странно народ предпочитает поменьше использовать виндоАПИ http://xn----8sbem0a3bea4g.xn-... -loga.html .К тому же одинаковое поведение проги в различных ОС может только приветствоваться.

З.Ы. Но это уже уходит во флуд.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.01.2017, 21:42
Лучший ответ Сообщение было отмечено drfaust как решение

Решение

Цитата Сообщение от drfaust Посмотреть сообщение
Просто видел решения вроде fopen()->fprint()->fclose(). fopen() тормозной, потому и возник вопрос - чем обосновано это открытие/закрытие....
Может афтору было лень по-человечески делать. Хотя если лог пишется 1 раз в минуту по 1 строке, то почему бы и не делать так. При таком раскладе код более локализованный получается. Но если логи пишутся сравнительно часто, то надо один раз файл открыть, каждую запись в файл оборачивать в критическую секцию (обложить мьютексами), а в конце один раз файл закрыть. fflush нужен тогда, когда лог должен быть доступен в реальном времени или когда есть опасение, что программа кердыкнется раньше времени и не успеет буфферизованные данные сбросить на диск. Если таких требований нет, то fflush лучше не ставить - меньше будет тормозить
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
24.01.2017, 12:08  [ТС]
Цитата Сообщение от drfaust Посмотреть сообщение
;/*for logs it`s needed, slower, but more reliable */
Сорри за мой корявый ангельский.
Думаю всё-таки не изгаляться и оставить fflush. Ну и мютекс опционально (условной компиляцией)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.01.2017, 12:51
Цитата Сообщение от drfaust Посмотреть сообщение
Думаю всё-таки не изгаляться и оставить fflush
Дело хозяйское. Добавлять или не добавлять, зависит от требований к программе (о чём я писал выше). Подход "я не понимаю, как это работает а потому для подстраховки добавлю то-то и то-то" он в общем-то сам по себе нормальный, но лишь до тех пор, пока характеристики программы не начинают упираться в "плохую" зону

Добавлено через 25 секунд
Цитата Сообщение от drfaust Посмотреть сообщение
Ну и мютекс опционально (условной компиляцией)
А этого я не понимаю
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
24.01.2017, 18:22  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
А этого я не понимаю
Включаем блокировки через #ifdef если надо, обычно они нафиг не нужны. Просто если один раз отладил по-человечески, то можешь пользоваться не ковыряясь в коде.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.01.2017, 18:53
Я имел в виду "не понимаю, зачем". Если программа многопоточная и разные потоки пишут в лог, то мьютекс нужен в любом случае

Добавлено через 45 секунд
Если имелось в виду, что эту функцию можно переносить в другую программу, Тогда да, это верное решение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2017, 18:53
Помогаю со студенческими работами здесь

Умножение матриц в многопоточной программе
class Program { static int value = 50; static void Main(string args) { int firstMatrix =...

Одновременный инкремент в многопоточной программе
Подпрограмма выполняется в многопоточном режиме. i, j - глобальные переменные. Каждый поток инкриминирует j и получает уникальный i. И...

Безопасный список в многопоточной программе
Итак, пусть есть некоторая программа. Предположим, что это игровой сервер. Необходимо вести в программе глобальный список и гроков, которые...

Устранение узкого места в многопоточной программе
Доброго времени суток, столкнулся с узким местом при разработке много поточной программы на питоне. Программа подсчитывает количество...

Медленная работа и ловля исключений в многопоточной программе
Здравствуйте. Сразу хочу предупредить, что это мой первый проект поэтому судите строго, но не тролльте ) В общем после прочтения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru