Re[11]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 06.07.16 06:57
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

AG>>Нет — критические секции в WinAPI не разделяются между процессами


B>Я про Mutex'ы.


AG>>Именно поэтому у меня и возник данный вопрос:

AG>>можно ли в Qt, boost, STL использовать такие штуковины, как критические секции

B>Да что вы так WinAPI боитесь-то? Напишите свой враппер, протестируйте его и забудьте про детали реализации.


Во-первых — я не боюсь WinAPI.
Более того, работал на старой работе в течение примерно 5-ти лет очень плотно и с WinAPI, и с MFC.
Посему и понимаю как достоинства, так и недостатки данного стека технологий.

Достоинство — хорошая оптимизация по производительности под ОС семейства Windows.
Дальше начинаются недоститки: нет кроссплатформенности — главный и основной из них.
Отсутствие лаконичности — "монстроидальность" недостаток небольшой, всегда можно найти класс-обёртку (на худой конец — взять что-то из MFC).

Во-вторых я прекрасно понимаю, что на сегодняшний день надо осваивать кроссплатформенные технологии.
Если завтра мой код придется портировать на Linux, то это портирование должно проходить максимально беспроблемно.
И вот тут уже "альтернативние" средства работы с многопоточностью начинают сильно проигрывть по производительности:
http://stackoverflow.com/questions/9997473/stdmutex-performance-compared-to-win32-critical-section

Относительно неплохим вариантом здесь выглядит свой собственный класс-обёртка,
оптимизированный к требованиям моего конкретного проекта и "скрывающий" детали реализации механизмов многопоточности.
Таким образом, мы будем иметь два таких класса — один для WinAPI, другой — для Linux.
Оба этих класса — должны наследовать общий интерфейс (aka абстрактный базовый класс).

B>Алсо, у Microsoft есть заголовочный файл concrt.h, в котором, помимо всего прочего, есть обёртка над критическими секциями. Насколько он публичный, я не в курсе, надо гуглить.

Есть такая штука, но это достаточно "редкий зверь".
И нет уверенности, что он не привязан к специфике конкретной ОС или студии. Его применение не выглядит как верное решение.
Вместо этого, для Windows можно всю обертку сделать на чистом WinAPI.

Ну и еще пару интересных ссылочек:
1) https://www.gittprogram.com/question/722603_std-mutex-performance-compared-to-win32-mutex-or-critical-section-apis.html
2) https://social.msdn.microsoft.com/Forums/vstudio/en-US/85652a61-33fb-4c17-9a05-2b241741fea7/concurrency-runtime-spinlock-?forum=parallelcppnative
Re[11]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:25
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>Да что вы так WinAPI боитесь-то? Напишите свой враппер, протестируйте его и забудьте про детали реализации.


пованивает немного
Re[12]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 07:26
Оценка:
CK>пованивает немного
?
Re[8]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:27
Оценка: +1
Здравствуйте, PM, Вы писали:

PM>Вообще в Windows Vista кроме Aero темы появилось новое ядро с новыми примитивами: CONDITION_VARIABLE и SRWLOCK. Последний можно использовать в реализации std::mutex, но не знаю так ли это в Visual C++


PM>https://msdn.microsoft.com/en-us/magazine/jj721588.aspx


Я бы, честно говоря, использовал везде std::mutex и все. Ну может быть boost::mutex если нужен бустовый thread::interrupt.
Re[9]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 07:32
Оценка:
CK>Я бы, честно говоря, использовал везде std::mutex и все. Ну может быть boost::mutex если нужен бустовый thread::interrupt.
Кстати, я лично натыкался на один очень неприятный баг std::mutex -- его использование в DLL ведёт к увеличению счётчика ссылок на эту самую DLL без последующего уменьшения (следовательно, хост-процесс не выгрузит её при вызове FreeLibrary, так что не будет вызвана функция DllMain и деструкторы объектов со static storage duration).
Re[5]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:36
Оценка:
Здравствуйте, AlexGin, Вы писали:

S>>Ну так приоткройте тайну, может вам более конкретные вещи посоветуют.

AG>Обработка данных. Эта обработка должна быть распараллелена по всем ядрам CPU.

AG>Ну а дальше — создать столько потоков (threads), сколько у нас ядер — и считать.

AG>Все потоки считают по одинаковому алгоритму, складывают данные (результаты) в общие коллекции.
AG>Вот собственно и все премудрости.

OpenMP или Intel.TBB. Это простой кейс — data-parallel алгоритм. Если делать это не через OpenMP итп то нужно подумать вот о чем:

— Какой минимальный размер входных данных, при которых нужно начинать выполнять обработку параллельно?
— На блоки какого размера разбивать входные данные (их нельзя разбить на N блоков, где N-количество цпу).
— Как балансировать нагрузку.
— Как складывать результаты (если в одну общую коллекцию, то тут нужно избежать false-sharing-а и race-ов, а также правильно организовать синхр-ю, чтобы не получить падение производительности, вместо прироста, если каждый поток будет писать в свою коллекцию (более предпочтительно), то нужно подумать о том, как объединять результаты).

В общем, это все делается элементарно, если есть parallel for или его аналог, мне кажется такое сейчас и в Qt должно быть.
Re[13]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:39
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

CK>>пованивает немного

B>?

Очень очень старая хрень, думаю что это не основное средство для разработки windows приложений уже давно. Дизайн самого API тоже не норм.
Re[10]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:40
Оценка: -1 :)
Здравствуйте, b0r3d0m, Вы писали:

B>Кстати, я лично натыкался на один очень неприятный баг std::mutex -- его использование в DLL ведёт к увеличению счётчика ссылок на эту самую DLL без последующего уменьшения (следовательно, хост-процесс не выгрузит её при вызове FreeLibrary, так что не будет вызвана функция DllMain и деструкторы объектов со static storage duration).


Потому что люди, пишущие на winapi, должны страдать.
Re: Вопрос по многопоточности для C++ проекта
От: _Artem_ Россия  
Дата: 06.07.16 07:40
Оценка: +2
Здравствуйте, AlexGin, Вы писали:

AG>Какие могут быть соображения по выбору?

AG>Огромное спасибо, за любые мысли!

Соображение очень простое. Не та проблема ставится. Она надуманная. Используй самый простой инструмент, он по скорости будет ничем не хуже. А скорость будешь потом искать, профайлером.
Re[14]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 07:40
Оценка:
CK>Очень очень старая хрень, думаю что это не основное средство для разработки windows приложений уже давно
Что именно? CRITICAL_SECTION? Оно ещё как в ходу.
Re[11]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 07:41
Оценка:
CK>Потому что люди, пишущие на winapi, должны страдать.
А на Linux посоветуете, что должны люди делать?
Re[15]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:43
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>Что именно? CRITICAL_SECTION? Оно ещё как в ходу.


я думаю что у windows разработчиков в ходу System.Thread.Monitor. CRITITCAL_SECTION это так — пережитки.
Re[15]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:45
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>Что именно? CRITICAL_SECTION? Оно ещё как в ходу.


Если серьезно — MS делает свою стандартную библиотеку с человеческими примитивами синхронизации не просто так, наверное, а из расчета, что ей будут пользоваться.
Re[16]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 07:45
Оценка: +1
CK>я думаю что у windows разработчиков в ходу System.Thread.Monitor. CRITITCAL_SECTION это так — пережитки.
Максималист в треде, все в укрытие.

System.Thread.Monitor -- для .NET. Как это поможет разработчику, пишущему на C++?
Re[16]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 07:47
Оценка:
CK>Если серьезно — MS делает свою стандартную библиотеку с человеческими примитивами синхронизации не просто так, наверное, а из расчета, что ей будут пользоваться.
std::mutex-то? Я ведь уже сказал, что в нём неплохой такой баг есть, а так я и не против его использования, где я говорил обратное?
Re[12]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:47
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

CK>>Потому что люди, пишущие на winapi, должны страдать.

B>А на Linux посоветуете, что должны люди делать?

Откуда мне знать? Я вообще на java и питоне в основном пишу. Но вообще, лично мне posix api куда более приятным кажется, нежели win.api.
Re[13]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 07:48
Оценка: +1
CK>люди, пишущие на winapi, должны страдать.
CK>Откуда мне знать? Я вообще на java и питоне в основном пишу
Всё ясно.
Re[17]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:49
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>std::mutex-то? Я ведь уже сказал, что в нём неплохой такой баг есть, а так я и не против его использования, где я говорил обратное?


А ты его засабмитил куда следует?
Re[18]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 07:50
Оценка:
CK>А ты его засабмитил куда следует?
Он уже до меня был засабмичен.
Re[17]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:50
Оценка:
Здравствуйте, b0r3d0m, Вы писали:


B>System.Thread.Monitor -- для .NET. Как это поможет разработчику, пишущему на C++?


C++/CLI FTW!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.