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

Поиск:

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


Опытный
**


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

Репутация: 1
Всего: 2



Cуществует ли "потокобезопасный" printf?
PM MAIL   Вверх
azesmcar
Дата 9.11.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(lv151 @  9.11.2011,  16:48 Найти цитируемый пост)
Cуществует ли "потокобезопасный" printf? 

Где? в C++ - нет! В текущем C++ вообще нет ничего потокобезопасного.
Может в какой нибудь библиотеке и есть.
Думаю написать свой не должно составить особого труда.
PM   Вверх
lv151
Дата 9.11.2011, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 2



Может какая-нибудь winapi оббёртка?
PM MAIL   Вверх
azesmcar
Дата 10.11.2011, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(lv151 @  9.11.2011,  17:29 Найти цитируемый пост)
Может какая-нибудь winapi оббёртка? 

 smile 

PM   Вверх
lv151
Дата 10.11.2011, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 2



 smile 
PM MAIL   Вверх
GremlinProg
Дата 10.11.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(lv151 @  9.11.2011,  18:48 Найти цитируемый пост)
Cуществует ли "потокобезопасный" printf?

конечно существует:
Код

int mtprintf( char*pszFmt, ... ){
    va_list Args;
    int Result;
    //
    va_start( Args, pszFmt );
    ::EnterCriticalSection( &cs_printf );
    Result    = vprintf( pszFmt, Args );
    ::LeaveCriticalSection( &cs_printf );
    va_end( Args );
    return Result;
}

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

если такой метод понадобился, значит в логику проекта откуда-то заполз нехороший таракан


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


Опытный
**


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

Репутация: 1
Всего: 2



OK.
PM MAIL   Вверх
feodorv
Дата 12.11.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(azesmcar @ 9.11.2011,  17:12)
В текущем C++ вообще нет ничего потокобезопасного.

За что ж Вы так((( Microsoft так старалась, чтобы всё было потокобезапасно smile 
Насколько я знаю, можно спокойно пользоваться printf из стандартной библиотеки безо всяких обёрток... Безопасно будет smile 


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


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(feodorv @  12.11.2011,  11:10 Найти цитируемый пост)
За что ж Вы так((( Microsoft так старалась, чтобы всё было потокобезапасно  

А причем тут microsoft? printf - сишная функция.

Цитата(feodorv @  12.11.2011,  11:10 Найти цитируемый пост)
Насколько я знаю, можно спокойно пользоваться printf из стандартной библиотеки безо всяких обёрток... Безопасно будет

"Насколько я знаю" - это не аргумент, где это написано?
http://msdn.microsoft.com/en-us/library/wc...z(v=vs.71).aspx
PM   Вверх
alexvs11
Дата 12.11.2011, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



основная проблема - перемешивание логов
эту проблему лекго решает критическая секция/мьютекс в юзерспейсе и спинлок в кернеле
PM MAIL   Вверх
azesmcar
Дата 12.11.2011, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(alexvs11 @  12.11.2011,  11:47 Найти цитируемый пост)
спинлок в кернеле

spinlock - это обыкновенное ожидание в цикле, он по определению никак не может быть в kernel-е.

PM   Вверх
alexvs11
Дата 12.11.2011, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



azesmcar, под кернелом я подразумеваю код, усполняющийся ядром, ну драйвера там
так в чем проблема?
PM MAIL   Вверх
azesmcar
Дата 12.11.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(alexvs11 @  12.11.2011,  12:10 Найти цитируемый пост)
azesmcar, под кернелом я подразумеваю код, усполняющийся ядром, ну драйвера там

critical section - пользовательские объекты, mutex-ы и semaphor-ы - объекты ядра.
Spinlock ожидание в цикле, причем тут ядро и драйверы?
PM   Вверх
alexvs11
Дата 12.11.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



Цитата(azesmcar @  12.11.2011,  12:48 Найти цитируемый пост)
Spinlock ожидание в цикле, причем тут ядро и драйверы? 

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


Эксперт
****


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

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



Цитата(azesmcar @  12.11.2011,  11:20 Найти цитируемый пост)
А причем тут microsoft? printf - сишная функция.

Автор топика просил что-нибудь из WinAPI. Однако даже на современных юниксах printf потокобезопасен.


Цитата(azesmcar @  12.11.2011,  11:20 Найти цитируемый пост)
"Насколько я знаю" - это не аргумент

Согласен, но я очень осторожен в безапелляционных высказываниях)))


Цитата(azesmcar @  12.11.2011,  11:20 Найти цитируемый пост)
где это написано?

Главное, что там не написано про потокоопасность printf. Про виды стандартной библиотеки смотрите там же: C Run-Time Libraries. И чтобы быть уж на все 100% уверенным, лучше пользовать много-поточную версию LIBC. В ней абсолютно все вызовы стандартной библиотеки потокобезопасны.

Однако даже в однопоточной версии LIBC printf потокобезопасна. Если хотите, продемонстрирую отрывками из исходных кодов LIBC (правда, прилагающихся к VC++ 6.0, но можно поискать и посвежее). Там внутри вызова как раз происходит обращения EnterCriticalSection/LeaveCriticalSection к одной из критических секций LIBC версии от Microsoft. Так что и перемешивания логов не будет smile 

Это сообщение отредактировал(а) feodorv - 13.11.2011, 10:02


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
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.0659 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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