Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 07:14
Оценка:
Доброе время суток, уважаемые коллеги!

Собираюсь делать новый проект на C++, при этом планирую активно
применять распарраллеливание обработки данных за счёт многопоточности.

Приложение — прежде всего планируется для Windows, но если будет поддержка кроссплатформенности — то это дополнительное преимущество.
Планирую применение библиотеки классов Qt 5.6. По крайней мере для настольной версии приложения.

В связи с этои возникает вопрос:
Оптимальная (прежде всего с точки зрения производительности) реализация многопоточности:
1) При помощи функций WinAPI — вероятно, это самый производительный вариант, однако недостаток — нет кроссплатформенности;
2) Средствами Qt — QThread кроссплатформенность есть, вопрос по производительности не очевиден, доп-бонус — отсутствие сложного кода, как в п.1;
3) Средствами STL — std::thread (примерно та же картина как и во втором пункте).
Дополнительная красота третьего пункта — если будет серверное приложение, без GUI, то не нужно "притягивать за уши" доплнительные библиотеки.

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

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

Огромное спасибо, за любые мысли!
Отредактировано 05.07.2016 7:20 AlexGin . Предыдущая версия .
Re: Вопрос по многопоточности для C++ проекта
От: Dair Россия  
Дата: 05.07.16 07:19
Оценка: +4
Здравствуйте, AlexGin, Вы писали:

AG>Оптимальная (прежде всего с точки зрения производительности) реализация многопоточности:

AG>1) При помощи функций WinAPI — вероятно, это самый производительный вариант, однако недостаток — нет кроссплатформенности;
AG>2) Средствами Qt — QThread кроссплатформенность есть, вопрос по производительности не очевиден, доп-бонус — отсутствие сложного кода, как в п.1;
AG>3) Средствами STL — std::thread (примерно та же картина как и во втором пункте).

Производительного?

Ты думаешь, Qt или stl будут делать лишнее переключение контекста? Думаешь, затраты на тред в Qt или stl больше пары-тройки уровней вложенности вызовов кода нативной платформы, т.е., в случае Windows — WinAPI?..

Я бы не парился и делал на самой удобной платформе, т.е., в твоём случае — на Qt. Всё равно на другой платформе без Qt не взлетит, значит, надо пользовать Qt на максимум.
Re: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 07:23
Оценка: +2
Лучше бы над выбором примитивов синхронизации и политикой разграничения доступа к разделяемым ресурсам задумался -- вот, где больше вероятность просадить своё приложение по производительности.
Re[2]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 07:30
Оценка:
Здравствуйте, Dair, Вы писали:

D>Производительного?

Ну я тут подразумеваю прежде всего производительность в работе средств синхронизации потоков.

D>Ты думаешь, Qt или stl будут делать лишнее переключение контекста? Думаешь, затраты на тред в Qt или stl больше пары-тройки уровней вложенности вызовов кода нативной платформы, т.е., в случае Windows — WinAPI?..

Думаю, что тут могут быть принципиальные различия — особенно в организации средств синхронизации потоков.

D>Я бы не парился и делал на самой удобной платформе, т.е., в твоём случае — на Qt.

+100500

D>Всё равно на другой платформе без Qt не взлетит, значит, надо пользовать Qt на максимум.

Не факт, что "без Qt не взлетит" — если делать серверную версию, то ИМХО возможно обойтись и проще.
Однако, я бы хотел все-таки выйти на применение Qt и для этого варианта.
Тем более, что применеие многопоточности для Qt окажется удобнее, чем "голый" STL.
Re[3]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 07:33
Оценка:
AG>Ну я тут подразумеваю прежде всего производительность в работе средств синхронизации потоков.

Кто тебе мешает использовать какие-нибудь EnterCriticalSection в сочетании с Qt-thread'ами?

AG>Тем более, что применеие многопоточности для Qt окажется удобнее, чем "голый" STL.


Не вижу там ничего более простого.
Re[2]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 07:38
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>Лучше бы над выбором примитивов синхронизации и политикой разграничения доступа к разделяемым ресурсам задумался -- вот, где больше вероятность просадить своё приложение по производительности.


Все делается step by step — сначала прорабатываем алгоритмы обработки данных в однопоточном варианте;
затем — определяемся с многопоточностью — хотя бы на уровне выбора библиотек;
после этого — прорабатываем многопоточный алгоритм и его реализацию (о чем Вы и пишете выше).
Re[3]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 07:40
Оценка: +1
AG>Все делается step by step — сначала прорабатываем алгоритмы обработки данных в однопоточном варианте;
AG>затем — определяемся с многопоточностью — хотя бы на уровне выбора библиотек;
AG>после этого — прорабатываем многопоточный алгоритм и его реализацию (о чем Вы и пишете выше).
Тогда берите наиболее подходящий по остальному проекту инструмент (если у вас везде Qt -- берите Qt, используете boost -- берите boost) и не парьтесь. Как только профилировщик / QA-инженер сообщит, что приложение не удовлетворяет требованиям по производительности, тогда и начинайте задумываться.
Re[3]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 07:42
Оценка: +2
В boost мне, кстати, очень нравится одна встроенная деталь -- наличие interruption point'ов, которых нет ни в стандартной библиотеке C++, ни в Qt.
Re[4]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 07:46
Оценка:
Здравствуйте, уважаемый b0r3d0m, Вы писали:

B>Кто тебе мешает использовать какие-нибудь EnterCriticalSection в сочетании с Qt-thread'ами?

Это теоретическое предположение, или есть Ваш опыт применения подобных решений?
Re[4]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 07:51
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>В boost мне, кстати, очень нравится одна встроенная деталь -- наличие interruption point'ов, которых нет ни в стандартной библиотеке C++, ни в Qt.

Спасибо, посмотрю в этом направлении!
Re[4]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 07:53
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>Тогда берите наиболее подходящий по остальному проекту инструмент (если у вас везде Qt -- берите Qt, используете boost -- берите boost) и не парьтесь. Как только профилировщик / QA-инженер сообщит, что приложение не удовлетворяет требованиям по производительности, тогда и начинайте задумываться.

Есть желание — выбрать наиболее верный путь на этапе проектирования, чтобы в будущем не "ломать все на корню", а тонко "доработать напильником".
Re[5]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 08:03
Оценка: 8 (3)
AG>Это теоретическое предположение, или есть Ваш опыт применения подобных решений?
Был опыт совместного использования boost::thread и CriticalSection из WinAPI.

Дело в том, что boost::mutex в текущих версиях boost'а реализован на основе Event'ов, и при определённой организации многопоточности переход на критические секции может дать прирост производительности.
Re[5]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 08:04
Оценка: +1
AG>Есть желание — выбрать наиболее верный путь на этапе проектирования, чтобы в будущем не "ломать все на корню", а тонко "доработать напильником".
Напишите свою абстрактную обёртку над потоками и используйте её в своём коде.
Re[6]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 09:03
Оценка:
Здравствуйте, уважаемый b0r3d0m, Вы писали:

B>Был опыт совместного использования boost::thread и CriticalSection из WinAPI.

Это интересно!

B>Дело в том, что boost::mutex в текущих версиях boost'а реализован на основе Event'ов, и при определённой организации многопоточности переход на критические секции может дать прирост производительности.

+100500
Я подозреваю, что это же самое относится и к std::mutex!
Re[7]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 09:24
Оценка:
AG>Я подозреваю, что это же самое относится и к std::mutex!
Нет, std::mutex реализован как раз на основе критических секций (по крайней мере, в Visual Studio 2013).
В любом случае, полагаться на детали реализации не стоит.
Re[3]: Вопрос по многопоточности для C++ проекта
От: Dair Россия  
Дата: 05.07.16 09:51
Оценка: 6 (1)
Здравствуйте, AlexGin, Вы писали:

D>>Производительного?

AG>Ну я тут подразумеваю прежде всего производительность в работе средств синхронизации потоков.

Всё равно это же решается внутри ядра ОС, т.е., средствами WinAPI под Win.


D>>Ты думаешь, Qt или stl будут делать лишнее переключение контекста? Думаешь, затраты на тред в Qt или stl больше пары-тройки уровней вложенности вызовов кода нативной платформы, т.е., в случае Windows — WinAPI?..

AG>Думаю, что тут могут быть принципиальные различия — особенно в организации средств синхронизации потоков.

Qt и stl просто врапят для тебя WinAPIшные функции. Да, накладные расходы, наверно, есть, но, если ты не синхронизируешь тысячу потоков каждый такт, проблем быть не должно.


D>>Я бы не парился и делал на самой удобной платформе, т.е., в твоём случае — на Qt.

AG>+100500

D>>Всё равно на другой платформе без Qt не взлетит, значит, надо пользовать Qt на максимум.

AG>Не факт, что "без Qt не взлетит" — если делать серверную версию, то ИМХО возможно обойтись и проще.
Тогда stl. Или boost вообще, там это решено уже давно, вроде как.
Но я не boost не знаю совсем, но многие хвалят.


AG>Однако, я бы хотел все-таки выйти на применение Qt и для этого варианта.

AG>Тем более, что применеие многопоточности для Qt окажется удобнее, чем "голый" STL.
Если ты не пишешь супер-highload, то Qt должен нормально справиться, равно как и stl.
Re[4]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 10:07
Оценка:
Здравствуйте, Dair, Вы писали:

D>Здравствуйте, AlexGin, Вы писали:


D>>>Производительного?

AG>>Ну я тут подразумеваю прежде всего производительность в работе средств синхронизации потоков.

D>Всё равно это же решается внутри ядра ОС, т.е., средствами WinAPI под Win.

Да, просто это может делаться разыими способами (так, например, синхронизировать потоки можно по-разному: мьютексом или крит/секцией).

D>>>Ты думаешь, Qt или stl будут делать лишнее переключение контекста? Думаешь, затраты на тред в Qt или stl больше пары-тройки уровней вложенности вызовов кода нативной платформы, т.е., в случае Windows — WinAPI?..

AG>>Думаю, что тут могут быть принципиальные различия — особенно в организации средств синхронизации потоков.

D>Qt и stl просто врапят для тебя WinAPIшные функции.

Это естественно так.
D>Да, накладные расходы, наверно, есть, но, если ты не синхронизируешь тысячу потоков каждый такт, проблем быть не должно.
Тут могут быть принципиально различные решения одних и тех же задач синхронизации (и те и другие в конечном итоге вызовут ф-ции WinAPI).

D>>>Я бы не парился и делал на самой удобной платформе, т.е., в твоём случае — на Qt.

AG>>+100500

D>>>Всё равно на другой платформе без Qt не взлетит, значит, надо пользовать Qt на максимум.

AG>>Не факт, что "без Qt не взлетит" — если делать серверную версию, то ИМХО возможно обойтись и проще.
D>Тогда stl. Или boost вообще, там это решено уже давно, вроде как.
D>Но я не boost не знаю совсем, но многие хвалят.
Да, boost хорошая штука — думаю в этом направлении.

AG>>Однако, я бы хотел все-таки выйти на применение Qt и для этого варианта.

AG>>Тем более, что применеие многопоточности для Qt окажется удобнее, чем "голый" STL.
D>Если ты не пишешь супер-highload, то Qt должен нормально справиться, равно как и stl.

Спасибо, уважаемый Dair!

В общем — пока раздумываю.
Мои мысли о выборе — между boost и Qt.
Re: Вопрос по многопоточности для C++ проекта
От: kov_serg Россия  
Дата: 05.07.16 10:19
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Доброе время суток, уважаемые коллеги!


AG>Собираюсь делать новый проект на C++, при этом планирую активно

AG>применять распарраллеливание обработки данных за счёт многопоточности.
...
AG>Огромное спасибо, за любые мысли!

Хочешь рапараленлить вычисления MPI, OpenACC, OpenCL

И потом пускаешь на многоядерной машине или машинах
Re[2]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 10:23
Оценка: +1
_>Хочешь рапараленлить вычисления MPI, OpenACC, OpenCL

Тогда уж и про OpenMP не забываем.
Re: Вопрос по многопоточности для C++ проекта
От: Chorkov Россия  
Дата: 05.07.16 10:27
Оценка: +1
Здравствуйте, AlexGin, Вы писали:

AG>Доброе время суток, уважаемые коллеги!


AG>Собираюсь делать новый проект на C++, при этом планирую активно

AG>применять распарраллеливание обработки данных за счёт многопоточности.

AG>Приложение — прежде всего планируется для Windows, но если будет поддержка кроссплатформенности — то это дополнительное преимущество.

AG>Планирую применение библиотеки классов Qt 5.6. По крайней мере для настольной версии приложения.

AG>В связи с этои возникает вопрос:

AG>Оптимальная (прежде всего с точки зрения производительности) реализация многопоточности:
AG>1) При помощи функций WinAPI — вероятно, это самый производительный вариант, однако недостаток — нет кроссплатформенности;
AG>2) Средствами Qt — QThread кроссплатформенность есть, вопрос по производительности не очевиден, доп-бонус — отсутствие сложного кода, как в п.1;
AG>3) Средствами STL — std::thread (примерно та же картина как и во втором пункте).
AG>Дополнительная красота третьего пункта — если будет серверное приложение, без GUI, то не нужно "притягивать за уши" доплнительные библиотеки.

AG>Я расположил эти пункты в порядке выбора наиболее производительного (на мой взгляд) решения.

AG>В проекте предполагается работа нескольких потоков, а также применение методов синхронизации потоков.
AG>Актуален обмен данными между потоками.

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


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


Qt/stl/boost являются очень тонким обертками над API. Оверхед по производительности минимален.
Выбор между ними имеет смысл делать только в контексте будущего перенесения кода на другие платформы, другие компиляторы (в т.ч. устаревшие), выненесения библиотеки в другие приложения (не GUI) и т.д.

Для полноты картины (особенно для выч. математики) стоит рассмотреть:
OpenMP
TBB
Распараллеливание на уровне библиотек, решающих отдельные подзадачи. (Например, решение системы линейных уравнений.)

Причем это скорее именно "другие подходы", и если переписать приложение с QThread на std::thred довольно просто, то перейти с std::thred на OpenMP (или с него) почти невозможно. Но зато многие задаче в этом подходе решаются действительно на порядок проще.
Re: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 05.07.16 10:28
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Собираюсь делать новый проект на C++, при этом планирую активно

AG>применять распарраллеливание обработки данных за счёт многопоточности.

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


В данном случае выбор не важен. Важны алгоритмы. Если параллельный алгоритм часто ждет на мьютексе, то реализация мьютекса не очень важна, на самом то деле. Он будет медленно работать. Поэтому я бы задумался прежде всего об алгоритмах и о том как избежать синхронизации, насколько это возможно. Конкретный инструмент я бы выбирал в зависимости от задачи, если у вас data-parallel алгоритмы, то стоит использовать OpenMP, например, а не явную синхронизацию, ну а если это серверное приложение — то стоит использовать то что предоставляет ваш тулкит для построения серверов (strands в boost.asio например).
Re[2]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 10:33
Оценка:
CK>Если параллельный алгоритм часто ждет на мьютексе, то реализация мьютекса не очень важна, на самом то деле
Зависит от задачи. Если время, которое будет затрачено на разделяемую задачу, сравнительно небольшое, то обращаться каждый раз к ядру, например, может быть слишком расточительно.
Re: Вопрос по многопоточности для C++ проекта
От: so5team https://stiffstream.com
Дата: 05.07.16 11:18
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Собираюсь делать новый проект на C++, при этом планирую активно

AG>применять распарраллеливание обработки данных за счёт многопоточности.

Многопоточность -- это инструмент, который используется в двух сильно разных направлениях:

1. Parallel computing. Т.е. использование распараллеливания вычислений на все доступные ядра для уменьшения общего времени решения задачи. При этом, вероятно, каждое ядро будет выполнять одну и ту же последовательность операций, но над разными порциями данных. В задачах подобного рода используются свои наборы инструментов. Например, MPI (совокупность однопоточных процессов, возможно, работающих на разных узлах), OpenMP (как расширения языка программирования и соответствующая поддержка со стороны компилятора), Threading Building Blocks, HPX и т.п.

2. Concurrent computing. Т.е. использование всех доступных ядер для параллельного выполнения различных (почти) независимых задач. При этом, вероятно, каждая задача будет выполнять свой собственный набор операций. Тут используется несколько другой набор инструментов (хотя тот же Threading Building Blocks может пригодиться и здесь).

Соответственно, для того, чтобы давать советы, нужно понимать, что именно вы понимаете под "распараллеливанием обработки данных". Может статься (причем это наверняка так), что для ваших задач уже давным давно придуманы инструменты, которыми нужно просто суметь воспользоваться. А не пытаться повторить их на коленке с помощью WinAPI или низкоуровневых оберток над системным API (вроде std::mutex-а).
Re[3]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 05.07.16 12:46
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>Зависит от задачи. Если время, которое будет затрачено на разделяемую задачу, сравнительно небольшое, то обращаться каждый раз к ядру, например, может быть слишком расточительно.


Нет, не зависит от задачи. Можно захватывать мьютекс относительно редко и ненадолго, но при этом система будет медленной (из-за cache line ping-pong-а и false sharing-а), а можно захватывать мютексы очень часто, на каждый чих вообще, но система будет работать быстро. Это вопрос дизайна алгоритмов и все. Никакая навороченная реализация примитивов синхронизации не спасет от их тупого использования.
Re[4]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 12:52
Оценка:
CK>а можно захватывать мютексы очень часто, на каждый чих вообще, но система будет работать быстро
Если система будет на каждый чих обращаться к ядру и засыпать в ожидании пробуждения, то о каком быстродействии может идти речь?
Re[5]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 05.07.16 13:49
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>Если система будет на каждый чих обращаться к ядру и засыпать в ожидании пробуждения, то о каком быстродействии может идти речь?


А мьютексы на каждый чих обращаются к ядру? Если захватывается свободный мьютекс, никакого обращения к ядру не происходит. Системный вызов выполняется только тогда, когда поток нужно усыпить, ну а задача параллельного алгоритма — сделать так, чтобы поток практически никогда не нужно было усыплять.

Пример — у тебя есть некий реестр объектов и есть потоки, которые работают с объектами из этого реестра. Обычно каждый поток работает со своим уникальным набором объектов, поэтому ты создаешь по одному локальному реестру объектов на каждый поток. Когда поток хочет начать работать с неким объектом, он берет и переносит атомарно объект из глобального реестра в свой локальный, по прошествии таймаута объект возвращается обратно, ну то есть это по сути реализация lease схемы, много где такое используется.
У глобального реестра есть мьютекс, у локального реестра есть мьютекс, у самого объекта тоже может быть мьютекс. Если потоку нужно обратиться к объекту, который был уже захвачен другим потоком — он получает адрес локального реестра того потока, захватывает его мьютекс и обращается к объекту. Но fast path — это захват одного или двух uncontended мьютексов, локальных для потока, никаких обращений к ядру, никаких дорогих операций. Дорогие операции появляются в slow path — захват мьютекса, принадлежащего другому потоку, который использовался другим потоком и даже может быть в данный момент захвачен этим другим потоком. Но это редкая операция.

Вот такие алгоритмы я имел ввиду. Это многопоточное программирвоание, все что не учитывает разницу между contended и uncontended состояниями мьютексов и памяти — многопоточным программированием не является, это просто разнообразные thread-safe реализации, которые могут иногда даже работать быстрее на многоядерных и многопроцессорных машинах (а могут и медленнее. Рассуждения о синхронизации без вот этого вот контекста — просто пустая трата времени, которая показывает только то, что рассуждающий очень поверхностно понимает многопоточность.
Re[6]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 14:20
Оценка:
CK>А мьютексы на каждый чих обращаются к ядру?
Насколько я знаю, в Windows -- да.
Re[7]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 05.07.16 15:51
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

CK>>А мьютексы на каждый чих обращаются к ядру?

B>Насколько я знаю, в Windows -- да.

Win API функции тоже могут делать что-нибудь в user-space. Я не знаю как это точно реализовано в win-api (не писал ничего под эту платформу лет эдак шесть), но например в linux никто никогда не делает системные вызовы напрямую — все вызовы завернуты в вызовы glibc и тот же pthread_mutex_lock много чего делает в userspace прежде чем делать системный вызов, там в принципе может и без системного вызова обойтись. Подозреваю в win32 api что-то похожее, ну либо у них там мьютекс это действительно голый объект ядра, а поддержку в userspace имеют только критические секции.
Re[8]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 16:02
Оценка:
CK>ну либо у них там мьютекс это действительно голый объект ядра, а поддержку в userspace имеют только критические секции.
Да.

Помимо этого, в Windows они могут шариться между процессами.
Re[2]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 16:23
Оценка:
Здравствуйте, so5team, Вы писали:

S>Здравствуйте, AlexGin, Вы писали:


AG>>Собираюсь делать новый проект на C++, при этом планирую активно

AG>>применять распарраллеливание обработки данных за счёт многопоточности.

S>Многопоточность -- это инструмент, который используется в двух сильно разных направлениях:


S>1. Parallel computing. Т.е. использование распараллеливания вычислений на все доступные ядра для уменьшения общего времени решения задачи. При этом, вероятно, каждое ядро будет выполнять одну и ту же последовательность операций, но над разными порциями данных. В задачах подобного рода используются свои наборы инструментов. Например, MPI (совокупность однопоточных процессов, возможно, работающих на разных узлах), OpenMP (как расширения языка программирования и соответствующая поддержка со стороны компилятора), Threading Building Blocks, HPX и т.п.

Да — именно об этом и идет речь в моём посте.

S>2. Concurrent computing. Т.е. использование всех доступных ядер для параллельного выполнения различных (почти) независимых задач. При этом, вероятно, каждая задача будет выполнять свой собственный набор операций. Тут используется несколько другой набор инструментов (хотя тот же Threading Building Blocks может пригодиться и здесь).

Это не для данного случая.

S>Соответственно, для того, чтобы давать советы, нужно понимать, что именно вы понимаете под "распараллеливанием обработки данных". Может статься (причем это наверняка так), что для ваших задач уже давным давно придуманы инструменты, которыми нужно просто суметь воспользоваться.

Вполне возможно.

S>А не пытаться повторить их на коленке с помощью WinAPI или низкоуровневых оберток над системным API (вроде std::mutex-а).

Дело в том, что в предшествующих разработках у меня наблюдалась работа над "вариантом 2".
Re[9]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 16:30
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

CK>>ну либо у них там мьютекс это действительно голый объект ядра, а поддержку в userspace имеют только критические секции.

B>Да.

B>Помимо этого, в Windows они могут шариться между процессами.


Нет — критические секции в WinAPI не разделяются между процессами:
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682608(v=vs.85).aspx

The threads of a single process can use a critical section object for mutual-exclusion synchronization. The process is responsible for allocating the memory used by a critical section object, which it can do by declaring a variable of typeCRITICAL_SECTION. Before using a critical section, some thread of the process must call InitializeCriticalSection orInitializeCriticalSectionAndSpinCount to initialize the object.


Вот полезная инфа:
http://stackoverflow.com/questions/800383/what-is-the-difference-between-mutex-and-critical-section

Критические секции в WinAPI — это легковесные объекты, которые не являются объектами ядра (при их создании нет опции LPSECURITY_ATTRIBUTES).

Именно поэтому у меня и возник данный вопрос:
можно ли в Qt, boost, STL использовать такие штуковины, как критические секции, не влезая в WinAPI?

То, что мьютексы работают более медленно, чем крит-секции — это известно:
http://stackoverflow.com/questions/9997473/stdmutex-performance-compared-to-win32-critical-section
Отредактировано 05.07.2016 17:43 AlexGin . Предыдущая версия . Еще …
Отредактировано 05.07.2016 16:44 AlexGin . Предыдущая версия .
Отредактировано 05.07.2016 16:39 AlexGin . Предыдущая версия .
Отредактировано 05.07.2016 16:37 AlexGin . Предыдущая версия .
Re[3]: Вопрос по многопоточности для C++ проекта
От: so5team https://stiffstream.com
Дата: 05.07.16 16:53
Оценка:
Здравствуйте, AlexGin, Вы писали:

S>>Соответственно, для того, чтобы давать советы, нужно понимать, что именно вы понимаете под "распараллеливанием обработки данных". Может статься (причем это наверняка так), что для ваших задач уже давным давно придуманы инструменты, которыми нужно просто суметь воспользоваться.

AG>Вполне возможно.

Ну так приоткройте тайну, может вам более конкретные вещи посоветуют.
Re[4]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 05.07.16 17:31
Оценка:
Здравствуйте, so5team, Вы писали:

S>Здравствуйте, AlexGin, Вы писали:


S>>>Соответственно, для того, чтобы давать советы, нужно понимать, что именно вы понимаете под "распараллеливанием обработки данных". Может статься (причем это наверняка так), что для ваших задач уже давным давно придуманы инструменты, которыми нужно просто суметь воспользоваться.

AG>>Вполне возможно.

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

Обработка данных. Эта обработка должна быть распараллелена по всем ядрам CPU.
Как подсчитать количество ядер — дело ясное:
    SYSTEM_INFO stInfo;
    GetSystemInfo(&stInfo);
    DWORD dwCPUCores = stInfo.dwNumberOfProcessors;

Ну а дальше — создать столько потоков (threads), сколько у нас ядер — и считать.
Все потоки считают по одинаковому алгоритму, складывают данные (результаты) в общие коллекции.
Вот собственно и все премудрости.
Re[5]: Вопрос по многопоточности для C++ проекта
От: so5team https://stiffstream.com
Дата: 05.07.16 18:02
Оценка: +1
Здравствуйте, AlexGin, Вы писали:

AG>Вот собственно и все премудрости.


Ну и чем вас не устраивает OpenMP?
Re[10]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 18:28
Оценка: :)
AG>Нет — критические секции в WinAPI не разделяются между процессами

Я про Mutex'ы.

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

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

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

Алсо, у Microsoft есть заголовочный файл concrt.h, в котором, помимо всего прочего, есть обёртка над критическими секциями. Насколько он публичный, я не в курсе, надо гуглить.
Re[5]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 05.07.16 18:31
Оценка:
AG>Как подсчитать количество ядер — дело ясное:
AG>
AG>    SYSTEM_INFO stInfo;
AG>    GetSystemInfo(&stInfo);
AG>    DWORD dwCPUCores = stInfo.dwNumberOfProcessors;
AG>


Зачем, когда в тех же std и boost уже давно есть абстракции в виде hardware_concurrency?
Re: Вопрос по многопоточности для C++ проекта
От: velkin Удмуртия https://kisa.biz
Дата: 05.07.16 18:59
Оценка: 18 (3)
Здравствуйте, AlexGin, Вы писали:

AG>В связи с этои возникает вопрос:

AG>Оптимальная (прежде всего с точки зрения производительности) реализация многопоточности:
AG>1) При помощи функций WinAPI — вероятно, это самый производительный вариант, однако недостаток — нет кроссплатформенности;
AG>2) Средствами Qt — QThread кроссплатформенность есть, вопрос по производительности не очевиден, доп-бонус — отсутствие сложного кода, как в п.1;
AG>3) Средствами STL — std::thread (примерно та же картина как и во втором пункте).
AG>Дополнительная красота третьего пункта — если будет серверное приложение, без GUI, то не нужно "притягивать за уши" доплнительные библиотеки.

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


На самом деле никакого выбора из этих трёх пунктов нет, нужно брать средства Qt. Теперь маленькое отступление по поводу комментария выше:
http://doc.qt.io/qt-4.8/qthread.html
http://doc.qt.io/qt-5/qthread.html

int QThread::idealThreadCount () [static]
Возвращает идеальное количество потоков, которое может быть запущено в системе. Она делает запрос количества процессорных ядер, как реальных, так и логических. Эта функция возвращает -1, если количество процессорных ядер не может быть определено.


Ещё добавлю, что параллельное программирование в Qt состоит не из одного QThread.

http://doc.qt.io/qt-5/threads-technologies.html
1) QThread: Low-Level API with Optional Event Loops
2) QThreadPool and QRunnable: Reusing Threads
3) Qt Concurrent: Using a High-level API

Пояснение:
http://doc.crossplatform.ru/qt/4.8.x/html-qt/threads-qtconcurrent.html

Пространство имен QtConcurrent предоставляет высокоуровневые API, которые делают возможным написание многопоточных программ без использования низкоуровневых потоковых примитивов, таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры. Программы, написанные с помощью QtConcurrent, автоматически приводят количество используемых потоков в соответствие с доступным количеством процессорных ядер. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании на многоядерных системах в будущем.


И немного классики:
http://www.intuit.ru/studies/courses/1156/190/lecture/4942?page=4

SISD (Single Instruction, Single Data) – системы, в которых существует одиночный поток команд и одиночный поток данных. К такому типу можно отнести обычные последовательные ЭВМ;
SIMD (Single Instruction, Multiple Data) – системы c одиночным потоком команд и множественным потоком данных. Подобный класс составляют многопроцессорные вычислительные системы, в которых в каждый момент времени может выполняться одна и та же команда для обработки нескольких информационных элементов; такой архитектурой обладают, например, многопроцессорные системы с единым устройством управления. Этот подход широко использовался в предшествующие годы (системы ILLIAC IV или CM-1 компании Thinking Machines), в последнее время его применение ограничено, в основном, созданием специализированных систем;
MISD (Multiple Instruction, Single Data) – системы, в которых существует множественный поток команд и одиночный поток данных. Относительно этого типа систем нет единого мнения: ряд специалистов считает, что примеров конкретных ЭВМ, соответствующих данному типу вычислительных систем, не существует и введение подобного класса предпринимается для полноты классификации; другие же относят к данному типу, например, систолические вычислительные системы (см. [51, 52]) или системы с конвейерной обработкой данных;
MIMD (Multiple Instruction, Multiple Data) – системы c множественным потоком команд и множественным потоком данных. К подобному классу относится большинство параллельных многопроцессорных вычислительных систем.


Причём за использование того же OpenMP, MPI или ещё чего-нибудь придётся заплатить свою цену. Если нужно обычное прикладное приложение, то проще использовать чистый Qt. Могу сказать и по другому, если используется Qt, то это явно прикладное приложение, а не какой-нибудь навороченный кластер на тысячи компьютеров, иначе это был бы boost или что-то в этом роде.

Таким образом логичнее всего делать проект на Qt, но изучить его возможности. Или взять для примера мой нетбук и десктоп:
http://ark.intel.com/ru/products/55637/Intel-Atom-Processor-N570-1M-Cache-1_66-GHz

Количество ядер 2
Количество потоков 4

http://ark.intel.com/ru/products/80807/Intel-Core-i7-4790K-Processor-8M-Cache-up-to-4_40-GHz

Количество ядер 4
Количество потоков 8

Разница между производительностью Intel® Atom™ Processor N570 и Intel® Core™ i7-4790K Processor просто огромна.
Intel Core i7-4790K @ 4.00GHz 11,197 попугаев
Intel Atom N570 @ 1.66GHz 576 попугаев

Но принципиальной разницы в программировании для того и другого процессора нет, просто нужно определиться с общей стратегией.
Отредактировано 05.07.2016 19:04 velkin . Предыдущая версия .
Re[3]: Вопрос по многопоточности для C++ проекта
От: kov_serg Россия  
Дата: 05.07.16 21:18
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

_>>Хочешь рапараленлить вычисления MPI, OpenACC, OpenCL


B>Тогда уж и про OpenMP не забываем.

Дык OpenMPI реализация MPI также как и MPICH
Re: Вопрос по многопоточности для C++ проекта
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 06.07.16 00:33
Оценка: 6 (2)
Здравствуйте, AlexGin, Вы писали:

AG>Актуален обмен данными между потоками.

Нужно сделать так чтобы был не актуален.
AG>Какие могут быть соображения по выбору?
QT
AG>Огромное спасибо, за любые мысли!
Только QT.
Sic luceat lux!
Re[7]: Вопрос по многопоточности для C++ проекта
От: PM  
Дата: 06.07.16 06:09
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

CK>>А мьютексы на каждый чих обращаются к ядру?

B>Насколько я знаю, в Windows -- да.

Емнип, кажется у Рихтера давно читал, что при захвате CRITICAL_SECTION делается короткий спинлок чтобы сразу не уходить в ядро.

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

https://msdn.microsoft.com/en-us/magazine/jj721588.aspx
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!
Re[18]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 07:51
Оценка:
CK>C++/CLI FTW!
Сами-то пробовали?
Re[12]: Вопрос по многопоточности для C++ проекта
От: Dair Россия  
Дата: 06.07.16 07:53
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

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

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

В Linux тоже "использование в DLL .so ведёт к увеличению счётчика ссылок на эту самую DLL .so без последующего уменьшения"?
Re[14]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:54
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

B>Всё ясно.


На плюсах я тоже пишу, с 2002-го года, если что. И даже Win32-api лет наверное пять использовал. Могу сравнивать.
Re[19]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:56
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

CK>>А ты его засабмитил куда следует?

B>Он уже до меня был засабмичен.

Забавно.

The trige meeting decided to not fix this particular issue. As a workaround it's recomended to terminate all the threads that were started or wait until they are finished.

Re[19]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:58
Оценка:
Здравствуйте, b0r3d0m, Вы писали:

CK>>C++/CLI FTW!

B>Сами-то пробовали?

Неописуемо удобная штука, когда нужно много нативного кода в .NET проект интегрировать.
Re[13]: Вопрос по многопоточности для C++ проекта
От: chaotic-kotik  
Дата: 06.07.16 07:59
Оценка:
Здравствуйте, Dair, Вы писали:

D>В Linux тоже "использование в DLL .so ведёт к увеличению счётчика ссылок на эту самую DLL .so без последующего уменьшения"?


Похоже что там не сбрасывается счетчик только если есть живые потоки, запущенные из этой dll, сложно это багом назвать, честно говоря.
Re[20]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 08:10
Оценка:
Они фигню сказали, в комментах уже успели обсудить этот "workaround".
Re[13]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 08:12
Оценка: 2 (1)
D>В Linux тоже "использование в DLL .so ведёт к увеличению счётчика ссылок на эту самую DLL .so без последующего уменьшения"?
Нет. Да и в случае Windows это всего лишь баг в реализации стандартной библиотеки. Если использовать соответствующие примитивы синхронизации (например, ту же CRITICAL_SECTION) напрямую, то увеличения счётчика ссылок не наблюдается.
Re[14]: Вопрос по многопоточности для C++ проекта
От: b0r3d0m  
Дата: 06.07.16 08:13
Оценка:
CK>Похоже что там не сбрасывается счетчик только если есть живые потоки, запущенные из этой dll
Нет, не только.
Re[2]: Вопрос по многопоточности для C++ проекта
От: AlexGin Беларусь  
Дата: 06.07.16 08:41
Оценка:
Здравствуйте, уважаемый velkin!
Огромное спасибо за столь развёрнутый ответ!

Скорее всего и остановим выбор именно на Qt!
По крайней мере в кроссплатформенной реализации.
Возможно, стоит применять Qt многопоточность даже для Windows реализации.
Тут надо проеэкспнриментировать — посчитать производительность, как она будет в сравнении с WinAPI.

V>Но принципиальной разницы в программировании для того и другого процессора нет, просто нужно определиться с общей стратегией.

Собственно этим и занимаюсь
Re[9]: Вопрос по многопоточности для C++ проекта
От: PM  
Дата: 06.07.16 11:44
Оценка: -1
Здравствуйте, chaotic-kotik, Вы писали:

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


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


CK>Я бы, честно говоря, использовал везде std::mutex и все. Ну может быть boost::mutex если нужен бустовый thread::interrupt.


Я бы тоже Просто топикстартеру зачем-то понадобился высокопроизводительный mutex и я вспомнил, что SRWLOCK работает в userspace.

Кстати, посмотрел в Visual C++ 2015 update3, там до сих пор какая-то лабуда в виде `_Mtx_internal_imp_t` внутри std::mutex. Похоже из-за того, что приходится поддерживать Windows XP.
Re[3]: Вопрос по многопоточности для C++ проекта
От: velkin Удмуртия https://kisa.biz
Дата: 06.07.16 17:54
Оценка: 4 (1)
Здравствуйте, AlexGin, Вы писали:

AG>Возможно, стоит применять Qt многопоточность даже для Windows реализации.

AG>Тут надо проеэкспнриментировать — посчитать производительность, как она будет в сравнении с WinAPI.

Думаю пункт 1, то есть WinAPI существенной роли не сыграет, в особенности, если понимать на что влияют технологии многопоточного программирования Qt.

http://doc.qt.io/qt-5/threads-technologies.html
1) QThread: Low-Level API with Optional Event Loops
2) QThreadPool and QRunnable: Reusing Threads
3) Qt Concurrent: Using a High-level API


Третий пункт тоже не имеет значения:

AG>Дополнительная красота третьего пункта — если будет серверное приложение, без GUI, то не нужно "притягивать за уши" дополнительные библиотеки.

Я просто беру и создаю в QtCreator консольное приложение:
#-------------------------------------------------
#
# Project created by QtCreator 2016-07-06T21:15:33
#
#-------------------------------------------------

QT       += core

QT       -= gui

TARGET = untitled
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp


Немного причёсываем:
TARGET = untitled
TEMPLATE = app

QT -= gui

CONFIG += console
CONFIG -= app_bundle

SOURCES += main.cpp


А потом можно создать составной проект с общими файлами и включёнными проектами gui-клиента и сервера. Или вот маленькая переделка кода:
#include <QDebug>

int main(int argc, char *argv[])
{
    qDebug() << "Hello World!";
    return 0;
}

В дебиане нажимаем Ctrl+Alt+F1, вводим root или другого пользователя с паролем и запускаем программу. Потом обратно выход на рабочий стол Ctrl+Alt+F7. Фишка в том, что функционал отвечающий за работу с параллельными потоками исполнения лежит в модуле QtCore. Между прочим, если совместить кроссплатформенные библиотеки, то тоже выйдет неплохое кроссплатформенное решение. Другое дело это не всегда целесообразно, особенно, если можно обойтись средствами Qt.

Ещё когда-то давным давно обсуждали статическую сборку Qt для Windows
Автор:
Дата: 18.12.11
. По прошествии многих лет могу сказать, что идея тоже не целесообразна, хотя всё прекрасно работает. Суть в том, что чем больше программист создаёт себе проблем, тем хуже для него. Отсюда вывод, не создавать надуманных проблем, лучше не идеально работающая система, чем идеальная не работающая.

Я не зря привёл пример компьютеров с низкой и высокой вычислительной мощью. Сдаётся мне в прикладном приложении можно убить месяцы на разработку велосипеда, а школьник Вася Пупкин стандартным функционалом на коленеке сделает так же или даже лучше, плюс ещё и кроссплатформенно. При этом он может и слов таких не знать, которыми обменивались в этой теме.
Re: Вопрос по многопоточности для C++ проекта
От: MasterZiv СССР  
Дата: 16.08.16 14:00
Оценка:
Здравствуйте, AlexGin, Вы писали:


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


Никаких, многопоточность уже входит в стандарт, ею и нужно пользоваться.
std::thread то есть.
При этом на производительность это либо вообще не повлияет, либо если и повлияет, то очень незначительно.
Re: Вопрос по многопоточности для C++ проекта
От: SaZ  
Дата: 25.08.16 08:03
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>...

AG>Какие могут быть соображения по выбору?
AG>Огромное спасибо, за любые мысли!

Тут уже всё расписали. Оставлю пару ссылок:
Преждевременная оптимизация
Производительность примитивов синхронизации в Qt
Re[8]: Вопрос по многопоточности для C++ проекта
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.08.16 08:34
Оценка: 2 (1)
Здравствуйте, chaotic-kotik, Вы писали:

CK>Win API функции тоже могут делать что-нибудь в user-space. Я не знаю как это точно реализовано в win-api (не писал ничего под эту платформу лет эдак шесть), но например в linux никто никогда не делает системные вызовы напрямую — все вызовы завернуты в вызовы glibc и тот же pthread_mutex_lock много чего делает в userspace прежде чем делать системный вызов, там в принципе может и без системного вызова обойтись. Подозреваю в win32 api что-то похожее, ну либо у них там мьютекс это действительно голый объект ядра, а поддержку в userspace имеют только критические секции.


В венде есть функция CreateMutex, она возвращает HANDLE (аналог, в некотором смысле, юниксного file descriptor) и именно этот объект виндовые программисты привыкли называть мьютексом. Любое телодвижение с ним — это системный вызов.

Есть так же объект по имени CRITICAL_SECTION, по смыслу своему он мьютекс-мьютексом, а все операции с ним, насколько возможно, делаются в user space (аналогично быстрым посиксным мьютексам в линухе). Его виндовые программисты привыкли называть не мьютексом, а критической секцией.

Такая вот культурно-терминологическая особенность.
Re[5]: Вопрос по многопоточности для C++ проекта
От: SaZ  
Дата: 31.08.16 07:59
Оценка:
Здравствуйте, AlexGin, Вы писали:

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


Qt concurrent

AG>Как подсчитать количество ядер — дело ясное:

AG>
AG>    SYSTEM_INFO stInfo;
AG>    GetSystemInfo(&stInfo);
AG>    DWORD dwCPUCores = stInfo.dwNumberOfProcessors;
AG>


QThread::idealThreadCount()

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

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

Qt concurrent map


Соглашусь с тем, что вы зря городите зоопарк технологий. Если уж проект на Qt — то используйте Qt. Искать узкие места и альтернативы начнёте когда упрётесь по производительности в реальных условиях.
Re: Вопрос по многопоточности для C++ проекта
От: Икс Россия  
Дата: 31.08.16 17:54
Оценка: -1 :)
Здравствуйте, AlexGin, Вы писали:

AG>Доброе время суток, уважаемые коллеги!


AG>Собираюсь делать новый проект на C++, при этом планирую активно

AG>применять распарраллеливание обработки данных за счёт многопоточности.

Как правильно заметили ранее "Преждевременная оптимизация есть корень всех зол".
По опыту скажу выбор Qt оптимален для проектирования кросплатформенного именно ГУИ приложения, он очень своеобразен и сложен, при работе с ним 60% времени уходит на чтения их документации, 30% на гугление и возгласы "сука-идиоты нельзя было написать это сразу", и Только 10% на собственно работу над проектом.
ВинАпи понятен как дважды два и всё отскакивает от зубов, ну для вашего случая порекомендовал бы чистый std либ.
Когда[если] захотите распаралелится там для этого всё есть.
Отредактировано 31.08.2016 17:56 Икс . Предыдущая версия .
Re[2]: Вопрос по многопоточности для C++ проекта
От: SaZ  
Дата: 31.08.16 21:16
Оценка:
Здравствуйте, Икс, Вы писали:


Икс>По опыту скажу выбор Qt оптимален для проектирования кросплатформенного именно ГУИ приложения,


Делал сервера на Qt. Может, конечно, показаться извратом, но очень сильно упрощает процесс. Из коробки есть интроспекция / рефлексия / базы / строки / многопоточность / кросс-поточные сигналы, COW для любых типов данных, файловая система и т.п. В общем, почти всё что надо. Ну и да, для GUI достаточно удобен.
Не нужно в результате городить зоопарк библиотек.

Икс> он очень своеобразен и сложен, при работе с ним 60% времени уходит на чтения их документации, 30% на гугление и возгласы "сука-идиоты нельзя было написать это сразу", и Только 10% на собственно работу над проектом.


Вопрос опыта. Как и с любым другим фреймворком / платформой / языком. Единственное, что мне не нравится в Qt, так это работа с json-ом. Нет возможностей для удобной генерации. Ну и да, из коробки нет http сервера.

Икс>ВинАпи понятен как дважды два и всё отскакивает от зубов, ну для вашего случая порекомендовал бы чистый std либ.


Только трудозатраты на несколько порядков выше. ВинАпи — это си, а не си плюс плюс. В лучшем случае — "си с классами".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.