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

С под Linux

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

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

22.01.2017, 22:36. Просмотров 286. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2017, 22:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция с fprintf в многопоточной программе (C Linux):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Dovgon
113 / 84 / 25
Регистрация: 08.04.2010
Сообщений: 533
23.01.2017, 08:51 #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();
0
Evg
Эксперт CАвтор FAQ
17813 / 6023 / 388
Регистрация: 30.03.2009
Сообщений: 16,552
Записей в блоге: 26
23.01.2017, 09:18 #3
В нормальном режиме работы должно быть так, что запись данных в логе составляет лишь небольшую долю времени от работы программы (потока). В противном случае нет смысла запускать несколько потоков, т.к. всё время будет потрачено на нераспараллеливаемую запись в лог-файл. Поэтому должно быть по барабану, какой метод синхронизации использовать

Про fflush вопрос не совсем понял. Ты считаешь, что он работает не правильно или чем вызван вопрос?
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
23.01.2017, 10:03 #4
delete
0
drfaust
258 / 149 / 37
Регистрация: 02.10.2008
Сообщений: 547
Записей в блоге: 1
Завершенные тесты: 1
23.01.2017, 17:53  [ТС] #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, потому и нужна синхронизация. Думаю сделать её условной компиляцией - если надо включится директивой/дефайном.
0
Dovgon
113 / 84 / 25
Регистрация: 08.04.2010
Сообщений: 533
23.01.2017, 17:58 #6
drfaust, Ты пишешь в тему Linux.
0
drfaust
258 / 149 / 37
Регистрация: 02.10.2008
Сообщений: 547
Записей в блоге: 1
Завершенные тесты: 1
23.01.2017, 18:02  [ТС] #7
Потому как линуха в первую очередь (POSIX), уже потом на другие.

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

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

Добавлено через 25 секунд
Цитата Сообщение от drfaust Посмотреть сообщение
Ну и мютекс опционально (условной компиляцией)
А этого я не понимаю
0
drfaust
258 / 149 / 37
Регистрация: 02.10.2008
Сообщений: 547
Записей в блоге: 1
Завершенные тесты: 1
24.01.2017, 18:22  [ТС] #13
Цитата Сообщение от Evg Посмотреть сообщение
А этого я не понимаю
Включаем блокировки через #ifdef если надо, обычно они нафиг не нужны. Просто если один раз отладил по-человечески, то можешь пользоваться не ковыряясь в коде.
0
Evg
Эксперт CАвтор FAQ
17813 / 6023 / 388
Регистрация: 30.03.2009
Сообщений: 16,552
Записей в блоге: 26
24.01.2017, 18:53 #14
Я имел в виду "не понимаю, зачем". Если программа многопоточная и разные потоки пишут в лог, то мьютекс нужен в любом случае

Добавлено через 45 секунд
Если имелось в виду, что эту функцию можно переносить в другую программу, Тогда да, это верное решение
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2017, 18:53
Привет! Вот еще темы с ответами:

Отсев одинаковых состояний в многопоточной программе с глубокими рекурсиями - Delphi
Полный текст программы с формой: Программа решает головоломку: - на прямоугольном поле в клеточку расставлено несколько фишек -...

fprintf - C++
fprintf Вопрос - данная ф-ция перезаписывает весь файл? То есть сначала очищает, а после записывает или же добавляет запись к концу?

fprintf scanf - C++
Помогите с кодом Хочу сделать считывание с файла и вывод в файл output input #include &lt;stdio.h&gt; #include &lt;io.h&gt; #include...

fwrite, fprintf - C++
Подскажите, что указывается в скобках у этих функций? 1 параметр файл, а что за конст_чар? Обьясните чайнику:(


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.01.2017, 18:53
Ответ Создать тему
Опции темы

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