Форум программистов, компьютерный форум CyberForum.ru

С под Linux

Войти
Регистрация
Восстановить пароль
 
drfaust
256 / 146 / 37
Регистрация: 02.10.2008
Сообщений: 528
Записей в блоге: 1
Завершенные тесты: 1
#1

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

22.01.2017, 22:36. Просмотров 221. Ответов 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)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dovgon
91 / 62 / 15
Регистрация: 08.04.2010
Сообщений: 425
23.01.2017, 08:51     Функция с fprintf в многопоточной программе #2
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();
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17179 / 5433 / 336
Регистрация: 30.03.2009
Сообщений: 14,720
Записей в блоге: 26
23.01.2017, 09:18     Функция с fprintf в многопоточной программе #3
В нормальном режиме работы должно быть так, что запись данных в логе составляет лишь небольшую долю времени от работы программы (потока). В противном случае нет смысла запускать несколько потоков, т.к. всё время будет потрачено на нераспараллеливаемую запись в лог-файл. Поэтому должно быть по барабану, какой метод синхронизации использовать

Про fflush вопрос не совсем понял. Ты считаешь, что он работает не правильно или чем вызван вопрос?
retmas
Жарю без масла
841 / 723 / 157
Регистрация: 13.01.2012
Сообщений: 1,666
23.01.2017, 10:03     Функция с fprintf в многопоточной программе #4
delete
drfaust
256 / 146 / 37
Регистрация: 02.10.2008
Сообщений: 528
Записей в блоге: 1
Завершенные тесты: 1
23.01.2017, 17:53  [ТС]     Функция с fprintf в многопоточной программе #5
Цитата Сообщение от 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, потому и нужна синхронизация. Думаю сделать её условной компиляцией - если надо включится директивой/дефайном.
Dovgon
91 / 62 / 15
Регистрация: 08.04.2010
Сообщений: 425
23.01.2017, 17:58     Функция с fprintf в многопоточной программе #6
drfaust, Ты пишешь в тему Linux.
drfaust
256 / 146 / 37
Регистрация: 02.10.2008
Сообщений: 528
Записей в блоге: 1
Завершенные тесты: 1
23.01.2017, 18:02  [ТС]     Функция с fprintf в многопоточной программе #7
Потому как линуха в первую очередь (POSIX), уже потом на другие.

З.Ы. Чёт ничего не нашёл по реентабельности syslog(), наверное тоже придётся "оборачивать" мютексами.
Dovgon
91 / 62 / 15
Регистрация: 08.04.2010
Сообщений: 425
23.01.2017, 18:15     Функция с fprintf в многопоточной программе #8
В win не ведутся лог файлы. Там есть журнал событий а с ними работать через winAPI.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
drfaust
256 / 146 / 37
Регистрация: 02.10.2008
Сообщений: 528
Записей в блоге: 1
Завершенные тесты: 1
23.01.2017, 18:18  [ТС]     Функция с fprintf в многопоточной программе #9
Dovgon, Как ни странно народ предпочитает поменьше использовать виндоАПИ http://xn----8sbem0a3bea4g.xn--p1ai/...niya-loga.html .К тому же одинаковое поведение проги в различных ОС может только приветствоваться.

З.Ы. Но это уже уходит во флуд.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17179 / 5433 / 336
Регистрация: 30.03.2009
Сообщений: 14,720
Записей в блоге: 26
23.01.2017, 21:42     Функция с fprintf в многопоточной программе #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от drfaust Посмотреть сообщение
Просто видел решения вроде fopen()->fprint()->fclose(). fopen() тормозной, потому и возник вопрос - чем обосновано это открытие/закрытие....
Может афтору было лень по-человечески делать. Хотя если лог пишется 1 раз в минуту по 1 строке, то почему бы и не делать так. При таком раскладе код более локализованный получается. Но если логи пишутся сравнительно часто, то надо один раз файл открыть, каждую запись в файл оборачивать в критическую секцию (обложить мьютексами), а в конце один раз файл закрыть. fflush нужен тогда, когда лог должен быть доступен в реальном времени или когда есть опасение, что программа кердыкнется раньше времени и не успеет буфферизованные данные сбросить на диск. Если таких требований нет, то fflush лучше не ставить - меньше будет тормозить
drfaust
256 / 146 / 37
Регистрация: 02.10.2008
Сообщений: 528
Записей в блоге: 1
Завершенные тесты: 1
24.01.2017, 12:08  [ТС]     Функция с fprintf в многопоточной программе #11
Цитата Сообщение от drfaust Посмотреть сообщение
;/*for logs it`s needed, slower, but more reliable */
Сорри за мой корявый ангельский.
Думаю всё-таки не изгаляться и оставить fflush. Ну и мютекс опционально (условной компиляцией)
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17179 / 5433 / 336
Регистрация: 30.03.2009
Сообщений: 14,720
Записей в блоге: 26
24.01.2017, 12:51     Функция с fprintf в многопоточной программе #12
Цитата Сообщение от drfaust Посмотреть сообщение
Думаю всё-таки не изгаляться и оставить fflush
Дело хозяйское. Добавлять или не добавлять, зависит от требований к программе (о чём я писал выше). Подход "я не понимаю, как это работает а потому для подстраховки добавлю то-то и то-то" он в общем-то сам по себе нормальный, но лишь до тех пор, пока характеристики программы не начинают упираться в "плохую" зону

Добавлено через 25 секунд
Цитата Сообщение от drfaust Посмотреть сообщение
Ну и мютекс опционально (условной компиляцией)
А этого я не понимаю
drfaust
256 / 146 / 37
Регистрация: 02.10.2008
Сообщений: 528
Записей в блоге: 1
Завершенные тесты: 1
24.01.2017, 18:22  [ТС]     Функция с fprintf в многопоточной программе #13
Цитата Сообщение от Evg Посмотреть сообщение
А этого я не понимаю
Включаем блокировки через #ifdef если надо, обычно они нафиг не нужны. Просто если один раз отладил по-человечески, то можешь пользоваться не ковыряясь в коде.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2017, 18:53     Функция с fprintf в многопоточной программе
Еще ссылки по теме:

Как работать с tty в программе, обращающейся к COM-порту C Linux
C Linux Как прописать путь к файлу в программе? Программа в Линукс среде
C Linux Ошибка в программе Anjuta
Указатель на сегмент .text в загруженной программе C Linux
C Linux Подлинковка к основной программе объектного файла?

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17179 / 5433 / 336
Регистрация: 30.03.2009
Сообщений: 14,720
Записей в блоге: 26
24.01.2017, 18:53     Функция с fprintf в многопоточной программе #14
Я имел в виду "не понимаю, зачем". Если программа многопоточная и разные потоки пишут в лог, то мьютекс нужен в любом случае

Добавлено через 45 секунд
Если имелось в виду, что эту функцию можно переносить в другую программу, Тогда да, это верное решение
Yandex
Объявления
24.01.2017, 18:53     Функция с fprintf в многопоточной программе
Ответ Создать тему
Опции темы

Текущее время: 00:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru