Проблемы с потоками для C / C ++ & # 8220; программисты системного уровня & # 8221; значительно отличается от тех, с которыми сталкиваются Java-программисты?

StackOverflow https://stackoverflow.com/questions/641514

Вопрос

Я ищу работу по разработке и вижу, что во многих списках указано, что разработчики должны разбираться в многопоточности. Это появляется как для списков вакансий Java, так и для списков C ++, которые включают «системное программирование»; в UNIX.

В последние несколько лет я работал с Java и использовал различные механизмы синхронизации.

В конце 90-х я много работал на C ++, хотя и очень мало. Однако в колледже мы использовали темы в Solaris.

Мой вопрос заключается в том, существуют ли существенные различия в проблемах, с которыми сталкиваются разработчики на C / C ++, по сравнению с разработчиками на Java, и являются ли какие-либо методы для их решения принципиально различными. Java, очевидно, включает в себя некоторые более приятные механизмы и синхронизированные версии коллекций и т. Д.

Если я хочу обновить или переучить потоки в UNIX, какой подход лучше? На какую библиотеку мне посмотреть? и т.д. Есть ли какое-нибудь отличное руководство по потокам в c ++?

Это было полезно?

Решение

Основные проблемы с многопоточностью (например, синхронизация, условия гонки, межпотоковое взаимодействие, очистка ресурсов), но Java делает поток намного более управляемым с помощью сборки мусора, исключений, расширенных объектов синхронизации, расширенной поддержки отладки с отражением.

С C ++ у вас гораздо больше шансов на повреждение памяти и "невозможность". условия гонки. И вам нужно будет написать гораздо больше низкоуровневых потоковых примитивов или полагаться на библиотеки (например, boost), которые не являются частью стандартизированного языка.

Другие советы

C ++ на самом деле проще писать сложный многопоточный код, чем Java, потому что у него есть особенность, которой нет в Java - RAII или "получение ресурсов является инициализацией". Эта идиома используется для всего управления ресурсами в хорошо написанном коде C ++, но особенно подходит для многопоточного кода, где автоматическое управление синхронизацией является обязательным.

Посмотрите pthreads и boost (pthreads был случайным lijnk, но в качестве отправной точки он выглядит нормально).

На высоком уровне проблемы для Java / C / C ++ / одинаковы. Особенности решения проблемы (вызываемые функции, создаваемые классы и т. Д.) Меняются от языка к языку.

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

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

Это зависит от того, на каком уровне вы решили работать. Intel TBB и OpenMP обрабатывают много общих случаев с довольно высокого уровня. Потоки Posix, API-интерфейсы Windows и переносимые библиотеки, такие как потоки Boost, приближают вас к тому же уровню, что и примитивы в Java.

Поток

C ++ 0x (особенно с барьерами памяти получения и выпуска) позволяет вам перейти на еще более низкий уровень для большего контроля и сложности, чем предлагает Java (маркировка переменной volatile в Java дает это и барьер захвата и выпуска памяти, но в Java вы не можете запросить только барьер захвата или только выпуска (где в C ++ 0x вы можете).

Обратите внимание, что модель многопоточности C ++ 0x преднамеренно низка, и мы надеемся, что люди будут строить на ней такие вещи, как TBB, и в следующий раз, когда комитет по стандартизации соберется, они смогут выяснить, кто из этих более высоких библиотеки уровней и инструментарий работают достаточно хорошо, чтобы учиться у них.

Независимо от того, какой язык программирования используется, характерная черта потока - обычное явление. Например, даже в ОС потоки POSIX & amp; Потоки WIN32 имеют одинаковый набор логических особенностей, хотя API вызывает & amp; Нативная реализация WRT, лежащая в основе аппаратного обеспечения / ядра, может измениться, но системным программистам логическое мышление о потоках & amp; как заставить их работать как положено & amp; в достижении этого является самой сложной частью. Это даже верно при переходе на языки программирования. Если вы действительно понимаете концепцию многопоточности Синхронизация потоков, вы готовы пойти & amp; используйте их на любых языках программирования, которые вам нравятся. Поскольку эти языки программирования предоставляют синтаксические сахара поверх собственной реализации синхронизации потоков / потоков.

scroll top