Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность, printf 
V
    Опции темы
GremlinProg
Дата 14.11.2011, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  13.11.2011,  12:00 Найти цитируемый пост)
Главное, что там не написано про потокоопасность printf.

сам printf не смотрел, может он и потокобезопасен (можно разобрать исходники),
но его основа - output, которой, например, я в основном и пользуюсь, точно не потокобезопасна и Microsoft в описании на это указывает:
Цитата

/***
*int _output(stream, format, argptr), static int output(format, argptr)
*
*Purpose:
*   Output performs printf style output onto a stream.  It is called by
*   printf/fprintf/sprintf/vprintf/vfprintf/vsprintf to so the dirty
*   work.  In multi-thread situations, _output assumes that the given
*   stream is already locked.
*
*   Algorithm:
*       The format string is parsed by using a finite state automaton
*       based on the current state and the current character read from
*       the format string.  Thus, looping is on a per-character basis,
*       not a per conversion specifier basis.  Once the format specififying
*       character is read, output is performed.
*
*Entry:
*   FILE *stream   - stream for output
*   char *format   - printf style format string
*   va_list argptr - pointer to list of subsidiary arguments
*
*Exit:
*   Returns the number of characters written, or -1 if an output error
*   occurs.
*ifdef _UNICODE
*   The wide-character flavour returns the number of wide-characters written.
*endif
*
*Exceptions:
*
*******************************************************************************/

Цитата(feodorv @  13.11.2011,  12:00 Найти цитируемый пост)
Так что и перемешивания логов не будет

перемешивание логов будет обязательно, иначе этот метод не потребовался бы,
причем этим перемешиванием желательно управлять хотя бы построчно, а еще лучше цветом,
иначе эта каша вывода будет бесполезна


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 14.11.2011, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



и, кстати, да, printf потокобезопасен:
printf.c:
Код

_lock_str2(1, stdout);

_file.c:
Код

void __cdecl _lock_file2 (
        int i,
        void *s
        )
{
        /*
         * The way the FILE is locked depends on whether it is part of _iob[]
         * _iob[] or not
         */
        if ( i < _IOB_ENTRIES )
        {
            /*
             * FILE lies in _iob[] so the lock lies in _locktable[].
             */
            _lock( _STREAM_LOCKS + i );
            /* We set _IOLOCKED to indicate we locked the stream */
            ((FILE*)s)->_flag |= _IOLOCKED;
        }
        else
            /*
             * Not part of _iob[]. Therefore, *s is a _FILEX and the
             * lock field of the struct is an initialized critical
             * section.
             */
            EnterCriticalSection( &(((_FILEX *)s)->lock) );
}

mlock.c:
Код

void __cdecl _lock (
        int locknum
        )
{

        /*
         * Create/open the lock, if necessary
         */
        if ( _locktable[locknum].lock == NULL ) {

            if ( !_mtinitlocknum(locknum) )
                _amsg_exit( _RT_LOCK );
        }

        /*
         * Enter the critical section.
         */

        EnterCriticalSection( _locktable[locknum].lock );
}

так что feodorv скорее прав, можно и без оберток )


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 14.11.2011, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



GremlinProg, спасибо  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
alexvs11
Дата 14.11.2011, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: нет
Всего: 10



GremlinProg, это что и вообще откуда?
в любом  случае это отдельно взятая реализация, которая в другой версии компилятора совершенно другая и ничем не обязана
PM MAIL   Вверх
GremlinProg
Дата 14.11.2011, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(alexvs11 @  14.11.2011,  11:58 Найти цитируемый пост)
это что и вообще откуда?

это статическая реализация CRT из MSVS 2010
Цитата(alexvs11 @  14.11.2011,  11:58 Найти цитируемый пост)
это отдельно взятая реализация, которая в другой версии компилятора совершенно другая и ничем не обязана

на счет "совершенно другая" я бы поспорил, но в общем-то, конечно, любая другая реализация может и не быть потокобезопасной,
если в стандарте нет оговорок по поводу потоков

у нас раздел такой,
API от Microsoft превалирует


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Alexeis
Дата 14.11.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(GremlinProg @  14.11.2011,  11:42 Найти цитируемый пост)
если в стандарте нет оговорок по поводу потоков

  А разве С++ что-то знает про потоки? В любом случае, если компилятор поставляется с многопоточной CRT, то проблем быть не должно. Думаю именно на это и нужно ориентироваться. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
xvr
Дата 14.11.2011, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Знаете, господа. Могу заявить по собственному опыту, что лог, порубленный в кашу посимвольво, конечно гораздо хуже читаем, чем порубленный в кашу построчно. Но извлечение полезной информации и из того и из другого, занятие достойное криптоаналитика  smile 
Так что не надо задаваться вопросом потокобезопасности printf'а, а надо разводить логи от разных потоков в разные файлы.  smile 

PM MAIL   Вверх
alexvs11
Дата 14.11.2011, 20:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: нет
Всего: 10



Цитата(xvr @  14.11.2011,  16:25 Найти цитируемый пост)
Так что не надо задаваться вопросом потокобезопасности printf'а, а надо разводить логи от разных потоков в разные файлы.

настоящий анализ начнется в попытках понять очередность их работы
PM MAIL   Вверх
Alexeis
Дата 14.11.2011, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(xvr @  14.11.2011,  17:25 Найти цитируемый пост)
Знаете, господа. Могу заявить по собственному опыту, что лог, порубленный в кашу посимвольво, конечно гораздо хуже читаем, чем порубленный в кашу построчно. Но извлечение полезной информации и из того и из другого, занятие достойное криптоаналитика

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GremlinProg
Дата 15.11.2011, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Alexeis @  14.11.2011,  23:54 Найти цитируемый пост)
  У меня примерно так работает лог, правда не в консоль вывод, а в файл. Из разных потоков пишут логи в кеш, который по таймауту или по наполнению сливается в один файл. Просматривая лог можно уловить последовательность операций. Пишется построчно, строки разных потоков чередуются, правда при этом каждый такой лог имеет префикс источника. 

а я так отлаживаю гибридные MPI-OpenMP-задачи, только пишу не в консоль и не в файл, а в сокет, определенному лог-серверу,
который все это дело показывает на своем десктопе в RTF-окнах

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

а префиксами выделяю лишь контекст задачи в пределах источника,

консоль конечно тоже вариант, но скудноватый, особенно, если потоков больше 8 ( цветов маловато, это затрудняет анализ разбора логов )


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
alexvs11
Дата 15.11.2011, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: нет
Всего: 10



ну виндузятники к слову могут пользоваться OutputDebugString 
она и логов не перемешивает, и тайминг есть, и в WinDbg можно логи расскрашивать в сколь угодно цветов
ну и по сети логи снимать может
PM MAIL   Вверх
Alca
Дата 15.11.2011, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Цитата

настоящий анализ начнется в попытках понять очередность их работы

Ну так можно время писать в лог


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 15.11.2011, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(alexvs11 @  14.11.2011,  20:33 Найти цитируемый пост)
настоящий анализ начнется в попытках понять очередность их работы 

Я для этого использовал timestamp.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0633 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.