У меня есть несколько потребительских потоков и один поток производителей. Нить производителя записывает данные в карту, принадлежащие определенному потребительскому потоку, и посылает сигнал на потребительский поток. Я использую мьютексы вокруг карты, когда я вставляю и стираю данные. однако этот подход выглядит неэффективным с точки зрения скорости. Можете ли вы предложить другой подход вместо карты, требующей блокировки и разблокировки мьютексов, и я думаю, что мьютекс замедляет передачу.C++ многопоточная медленная обработка
ответ
Однако этот подход выглядит неэффективным с точки зрения скорости. Можете ли вы предложить другой подход вместо карты, требующей блокировки и разблокировки мьютексов, и я думаю, что мьютекс замедляет передачу.
Вы должны использовать профилировщик, чтобы определить, где находится узкое место.
Производитель поток записывает данные в карту принадлежат к определенному потребительскому потоке и посылает сигнал на потребительский поток.
Производитель не должен заботиться о том, какую структуру данных использует потребитель - это деталь реализации потребителя. Имейте в виду, что для вставки значения в карту требуется выделение памяти (если вы не используете пользовательский распределитель), а выделение памяти внутренне занимает блокировки, а также для защиты состояния кучи. Конечным результатом является то, что блокировка мьютекса вокруг операции map::insert
может блокировать ее слишком долго.
Простейший и эффективный дизайн будет состоять из атомной очереди между производителем и потребителем (например, pipe, TBB concurrent_bounded_queue, который предварительно распределяет его хранилище, чтобы операции push/pop действительно быстр). Так как ваш производитель напрямую связывается с каждым потребителем, очередь представляет собой устройство с одним писателем и может быть реализована как очередь ожидания (или кольцевой буфер a-la C++ disruptor).
Andrei Alexandrescu отметил, что вы должны измерить свой код (https://www.facebook.com/notes/facebook-engineering/three-optimization-tips-for-c/10151361643253920), и это тот же совет, который я бы вам дал, чтобы измерить ваш код и посмотреть, какие различия в производительности вы получаете между базовым тестом и ваш тест работает однопоточны:
- времени, необходимое для вставки данных с использованием одного потока для отображения с вышеперечисленными данными
- времени, необходимым для вставки данных с использованием одного потока к карте с вышеперечисленными данными и с помощью мьютекса замков
Если вы все еще ищете поточно-контейнер, вы можете захотеть взглянуть на компании Intel с открытым исходным кодом реализации потокобезопасных контейнеров в http://www.threadingbuildingblocks.org/docs/help/reference/containers_overview/concurrent_queue_cls.htm.
Кроме того, в качестве предложения для реализации потребительских потоков, вы можете прочитать статьи ActiveObject что Herb Sutter разместил на своем сайте: http://herbsutter.com/2010/07/12/effective-concurrency-prefer-using-active-objects-instead-of-naked-threads/
Если вы можете предоставить некоторые дополнительные детали, например, почему карта должна быть заблокирована все время, мы сможем разработать механизм, который лучше работает.
- 1. C++ Builder, многопоточная обработка TIdTCPServer
- 2. Многопоточная обработка
- 3. Автоматическая многопоточная обработка?
- 4. Скрученная многопоточная обработка сигналов
- 5. Многопроцессорная и многопоточная обработка
- 6. Многопоточная обработка не работает
- 7. Многопоточная/параллельная обработка
- 8. Многопроцессорная или многопоточная обработка?
- 9. Многопоточная обработка Проблема
- 10. DBUS - многопоточная обработка
- 11. Многопоточная обработка в .NET
- 12. Многопоточная обработка Apache Camel
- 13. Многопоточная обработка вокруг запроса
- 14. Почему многопоточная медленная петля в java?
- 15. Простая обработка прерываний/многопоточная программа?
- 16. Многопоточная сериализация в C#
- 17. Многопроцессорная/многопоточная обработка в Python ..?
- 18. Многопоточная обработка из очереди Java
- 19. Многопоточная обработка строк взрывается #threads
- 20. Превосходная многопоточная обработка в Lua
- 21. ActiveMQ: Медленная обработка потребителей
- 22. Обработка куба слишком медленная
- 23. Обработка CFloop Чрезвычайно медленная
- 24. Android - медленная обработка изображений
- 25. Swift - многопоточная многопоточная обработка GCD, «мутированная при перечислении»
- 26. C# параллельная и многопоточная обработка на одноядерном процессоре
- 27. медленная обработка нг-повтор массива
- 28. медленная обработка файлов в python
- 29. ANDROID - обработка dx слишком медленная
- 30. jni - Медленная обработка в native
Можете ли вы предложить пример реализации этих очередей? Являются ли они стандартными в STL или где-то еще? Вы имеете в виду std :: atomic? –
@AvbAvb Я добавил пару ссылок. –