2014-10-02 2 views
1

У меня есть общий вопрос о параллельном программировании на C и C++ и был бы признателен, если бы вы могли ответить на него. Насколько я знаю, мы можем объявить переменную, по крайней мере, на одном уровне выше (родительский поток), чтобы делиться ею среди дочерних потоков. Итак, мне было интересно, есть ли другой способ обмена переменной между потоками с одним и тем же родительским потоком? Является ли этот API зависимым или нет?Способы обмена переменной между потоками

+1

Вы также можете торговать информацией по перекрестным потокам через систему [сообщение прохождения] (http://en.wikipedia.org/wiki/Message_passing), эта информация вполне может быть значением или адресом переменной, которую вы хотите доля – Drax

+0

две основные проблемы: a. будет ли «разделяемая» переменная, на которую будет написано? б. это критично?Я могу просто определить глобальный, инициализировать его перед началом моих потоков и использовать его как только для чтения (плохой дизайн, но работает). Кроме того, если я его обновляю, а значение в других потоках не критично (например, я использую его только как средство просмотра отладки), я могу снова использовать его аналогичным образом. Если это критическое значение и нуждается в изменении, возникает проблема - модель памяти C++ (или ее отсутствие). См. Ответ Basile для каждой версии/реализации. – Fox

+0

Я больше искал место, где могут быть объявлены общие данные (переменная). Он должен быть, по крайней мере, на один уровень выше, чем потоки, которые хотят поделиться им, независимо от того, какой API параллельного программирования используется. Правильно? – user3684042

ответ

11

Для резьбы 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 часто является полезной моделью.

+2

Возможно также быть связанными: [thread_local] (http://en.cppreference.com/w/cpp/language/storage_duration) (стандартный стандарт TLS) –

+0

Я больше искал место, где общие данные (переменные) могут быть объявлен. Он должен быть, по крайней мере, на один уровень выше, чем потоки, которые хотят поделиться им, независимо от того, какой API параллельного программирования используется. Правильно? – user3684042

+0

A * variable * - это что-то текстовое в исходном коде. Важно то, что место памяти. (подумайте о локальных переменных в рекурсивных функциях, чтобы увидеть разницу). –

6

В C++ и C любое место в памяти (идентифицируемое переменной) может быть разделено между потоками. Объем памяти одинаковый для всех потоков. Нет отношения родительского/дочернего потока с памятью.

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

Это зависит от реализации.

1

Любая глобальная переменная разделяется между потоками, так как потоки представляют собой процессы легкого веса, разделяющие одно и то же адресное пространство. Для синхронизации вам необходимо обеспечить взаимное исключение при обновлении/доступе к этим глобальным переменным через семафоры или ожидание блоков уведомлений.

Смежные вопросы