Безопасно ли нить после разветвления? - PullRequest
8 голосов
/ 16 сентября 2010

Я узнал, что вы обычно должны придерживаться разветвления или многопоточности, чтобы избежать очень странных и чрезвычайно трудных для отладки проблем, поэтому до сих пор я всегда делал именно это. Моя проблема в том, что когда я придерживаюсь только разветвления, создание многих короткоживущих процессов для распределения кусков работы становится более дорогим с большим количеством ядер ЦП, которые я хочу кормить, вплоть до некоторого производительность точки просто больше не масштабируется разумно. В то же время, используя только потоки, я должен быть очень осторожным в отношении того, какие библиотеки я использую, и, как правило, быть крайне защищенным в отношении безопасности потоков, что отнимает много драгоценного времени на разработку и приводит к отказу от некоторых любимых библиотек. Поэтому, хотя я и предупрежден, мысль о смешивании разветвления и многопоточности привлекает меня на нескольких уровнях.

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

Учитывая, что я спроектировал систему, которая будет запускать, демонизировать, разветвлять свои основные уровни и никогда больше не будет разветвляться после того, как я стану совершенно безопасным и надежным. Если некоторые из этих предварительно разветвленных уровней теперь начнут использовать потоки , чтобы распределить свою рабочую нагрузку по многим ядрам ЦП, так что различные дочерние процессы никогда не узнают о третий ребенок, будет ли это безопасно все же? Я могу заверить, что каждый уровень сам по себе является поточно-ориентированным, и что не-поточно-безопасные уровни никогда не запустят собственный поток.

Хотя я чувствую в этом подходе достаточно безопасно, я был бы признателен за несколько профессиональных мнений по этому вопросу, указав на всевозможные предостережения, интересные точки зрения, ссылки на расширенное чтение и т. Д. Я лично использую Perl для Debian, RedHat, SuSe и OS X, но тема должна быть достаточно общей, чтобы быть действительной для любого языка на любой Un * x / BSD-подобной платформе, которая будет вести себя удаленно POSIXish, может быть, даже Interix.

Ответы [ 2 ]

8 голосов
/ 16 сентября 2010

создание множества кратковременных процессов для распределения кусков работы, что удорожает процесс с большим количеством ядер ЦП, которые я хочу загрузить

Не совсем.

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

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

А. Нет вопросов безопасности потока.

4 голосов
/ 16 сентября 2010

Ваш подход хорош в POSIX, если вы не создаете области общей памяти MAP_SHARED, которые являются общими для разветвленных процессов. Как только процессы разветвляются, они становятся независимыми.

См. Документацию POSIX по fork().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...