2011-02-07 3 views
1

У меня есть приложение, которое использует потоки. Теперь, когда программа сначала запускается, я хочу, чтобы она проходила настройку соединений с базой данных и еще что-то до нее, чтобы все, кто запускал программу, мог знать, была ли начата ошибка.Фоновый рисунок приложения с вилкой()

Я немного оглянулся и нашел несколько ресурсов, которые говорят: «Не смешивайте вилку и нити», в то время как другие говорят, что разветвление в linux будет только дублировать основной поток и оставить остальных в покое.
В случае последнего (где он просто дублирует основной поток), как же тогда потоки доступа к файловым уровням (глобальным) переменным? Не смогут ли потоки получить доступ к переменным, которые теперь находятся в адресном пространстве разветвленного процесса?

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

Примечание: во время вилки потоки будут выполнять цикл sleep(), пока основной поток не поместит данные в общую переменную для их обработки. Поэтому, если сон прервется, они не пострадают.

ответ

3

Невозможно дублировать потоки как часть fork, и потоки родителя прекратятся при выходе родителя, поэтому даже если они смогут получить доступ к памяти ребенка, это не поможет вам. Вам нужно либо создать свои потоки после форкирования, либо использовать pthread_atfork для регистрации обработчиков, которые будут воссоздавать их в дочернем процессе. Я бы рекомендовал просто ждать, пока после forking создаст ваши потоки, так как это намного проще и эффективнее.

Почему вы хотите отложить разветвление как можно дольше? Если вы хотите поддерживать соединение с терминалом или чем-то еще до завершения инициализации, вы можете просто закончить процесс родительского процесса до тех пор, пока дочерний процесс (с его потоками) не будет инициализирован и не будет готов «в фоновом режиме». Для этого можно использовать различные инструменты синхронизации. Один простой - открыть трубу, через которую ребенок отправит свой вывод обратно родительскому, чтобы отобразить; родитель может просто выйти, когда он получит EOF на этом канале.

+0

Ничего себе, я чувствую себя глупо, не думая сначала о «вилке», а затем просто подождите, пока ребенок не инициализируется до выхода из решения. Это очень чистое и эффективное решение. Спасибо :-) – Patrick

0

Формирование процесса создает два разных процесса и потоки в одном процессе не смогут получить доступ к памяти во втором процессе. Если вы хотите, чтобы разные процессы обращались к одной и той же памяти, вам нужно что-то, называемое разделяемой памятью.

0

Когда поток процесса вызывает fork(), новый процесс создается путем копирования, среди прочего, (1) полного адресного пространства процесса и (2) потока, который называется fork. Если в процессе есть другие потоки, они не копируются. Это почти наверняка приведет к ошибкам в вашей программе. Следовательно, советуем не смешивать нитки и вилки.

Если вы хотите создать фоновый процесс со многими темами, то вы должны must fork его перед тем, как нерест какой-либо другой темы. Затем два процесса ведут себя нормально, как и любые два изолированных процесса: потоки внутри одного процесса имеют одну и ту же память, но ваши фоновые потоки и ваш процесс переднего плана не будут разделять память (по умолчанию).

+0

Делает смысл. Я думал, может быть, разные советы были связаны с различными реализациями потоков. Когда вилка дублирует основной поток, а другие потоки не дублируются, они не могут получить доступ к памяти вилки, так как я ожидаю, что что-то будет работать.Просто не знал, есть ли там какая-то фоновая магия. – Patrick

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