У меня есть общий вопрос о параллельном программировании на C и C++ и был бы признателен, если бы вы могли ответить на него. Насколько я знаю, мы можем объявить переменную, по крайней мере, на одном уровне выше (родительский поток), чтобы делиться ею среди дочерних потоков. Итак, мне было интересно, есть ли другой способ обмена переменной между потоками с одним и тем же родительским потоком? Является ли этот API зависимым или нет?Способы обмена переменной между потоками
ответ
Для резьбы Posix, прочитайте pthread tutorial.
Для C++11, прочитайте документацию по своему thread library
Всех threads той же process акции жеaddress space в virtual memory. В комментариях Marco A. рассмотрите также thread_local переменных.
Обратите внимание, что вы разделяете данные или memory (не переменные, которые существуют только в исходном коде)
На практике, вы будете лучше защитить с mutex общих данных (для синхронизации), чтобы избежать data races.
В простом случае мьютексы и общие данные находятся в некоторых глобальных переменных.
Вы также можете использовать операции atomic.
Кстати, вы также можете разработать параллельное приложение, используя некоторую парадигму message passing, например. используя MPI (или просто используя некоторые RPC или другие сообщения, например JSON на сокетах). Вы можете рассмотреть возможность использования обычных цифровых приложений для использования GPGPU, например. используя OpenCL. И, конечно же, вы можете смешать все подходы (используя OpenCL, с несколькими потоками и с вашим параллельным программным обеспечением, работающим в нескольких таких процессах, взаимодействующих с MPI).
Отладка сильно параллельного программного обеспечения может стать кошмаром. Производительность может зависеть от аппаратной системы и может потребовать сложной настройки. scalability и synchronization могут стать растущей проблемой. map-reduce часто является полезной моделью.
Возможно также быть связанными: [thread_local] (http://en.cppreference.com/w/cpp/language/storage_duration) (стандартный стандарт TLS) –
Я больше искал место, где общие данные (переменные) могут быть объявлен. Он должен быть, по крайней мере, на один уровень выше, чем потоки, которые хотят поделиться им, независимо от того, какой API параллельного программирования используется. Правильно? – user3684042
A * variable * - это что-то текстовое в исходном коде. Важно то, что место памяти. (подумайте о локальных переменных в рекурсивных функциях, чтобы увидеть разницу). –
В C++ и C любое место в памяти (идентифицируемое переменной) может быть разделено между потоками. Объем памяти одинаковый для всех потоков. Нет отношения родительского/дочернего потока с памятью.
Задача состоит в том, чтобы контролировать или синхронизировать доступ к ячейке памяти между потоками.
Это зависит от реализации.
Любая глобальная переменная разделяется между потоками, так как потоки представляют собой процессы легкого веса, разделяющие одно и то же адресное пространство. Для синхронизации вам необходимо обеспечить взаимное исключение при обновлении/доступе к этим глобальным переменным через семафоры или ожидание блоков уведомлений.
- 1. Канал для обмена данными между потоками
- 2. Пожизненные проблемы обмена ссылками между потоками
- 3. Способы обмена конфигурацией между двумя приложениями?
- 4. Поделитесь одной переменной между потоками?
- 5. Объявление переменной, разделяемой между потоками
- 6. Поделиться переменной между несколькими потоками
- 7. Обмен потоками между процессами?
- 8. Является ли эта стратегия обмена объектами между потоками?
- 9. PHP: Совместное использование статической переменной между потоками
- 10. Обмен переменной между потоками в JAVA
- 11. `volatile` для синхронизации переменной между потоками
- 12. повысить асинхронную (неблокирующую) связь для обмена данными между несколькими потоками
- 13. java.lang.ClassCastException: android.app.Application с использованием сокета как глобальной переменной для обмена между действиями и потоками
- 14. Каков наилучший способ обмена статической переменной между двумя потоками в .net
- 15. Делиться информацией между потоками
- 16. Различные способы инициализации переменной
- 17. Способы обмена константами между приложениями, написанными на Ruby и C?
- 18. Ошибка обмена переменной между двумя вложенными функциями
- 19. Перенос разъемов между потоками.?
- 20. Какие хорошие способы вызвать проблемы с потоками?
- 21. Можем ли мы использовать команду `shuffle()` для обмена рег-рег-обмена между элементами (потоками) в WaveFront?
- 22. MapViewOfFile с указателями между потоками
- 23. Общая память между потоками
- 24. Частная система обмена сообщениями с потоками/ответами
- 25. Отличие между потоками Java и потоками ОС?
- 26. Разница между несинхронизированными потоками и синхронизированными потоками
- 27. Разница между потоками SwingUtilities и потоками AWT.EventQueue
- 28. Способы присвоения значения переменной
- 29. Python: обмен списком между потоками
- 30. Java: синхронизация переменных между потоками
Вы также можете торговать информацией по перекрестным потокам через систему [сообщение прохождения] (http://en.wikipedia.org/wiki/Message_passing), эта информация вполне может быть значением или адресом переменной, которую вы хотите доля – Drax
две основные проблемы: a. будет ли «разделяемая» переменная, на которую будет написано? б. это критично?Я могу просто определить глобальный, инициализировать его перед началом моих потоков и использовать его как только для чтения (плохой дизайн, но работает). Кроме того, если я его обновляю, а значение в других потоках не критично (например, я использую его только как средство просмотра отладки), я могу снова использовать его аналогичным образом. Если это критическое значение и нуждается в изменении, возникает проблема - модель памяти C++ (или ее отсутствие). См. Ответ Basile для каждой версии/реализации. – Fox
Я больше искал место, где могут быть объявлены общие данные (переменная). Он должен быть, по крайней мере, на один уровень выше, чем потоки, которые хотят поделиться им, независимо от того, какой API параллельного программирования используется. Правильно? – user3684042