Подтвердить что ты не робот

Вилка в многопоточной программе

Я слышал, что микширование и потоки в программе может быть очень проблематичным, что часто приводит к таинственным поведением, особенно при работе с общими ресурсами, такими как блокировки, каналы, файловые дескрипторы. Но я никогда не понимаю, в чем именно опасности, и когда это может произойти. Было бы здорово, если бы кто-то, кто имел опыт в этой области, мог более подробно объяснить, что такое подводные камни и что нужно заботиться при программировании в такой среде.

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

Пожалуйста, не сузите свой ответ, просто "отвечая" на мой примерный сценарий. Любые предложения, альтернативные решения или опыт, не связанные с примером, но полезные для обеспечения чистого дизайна, были бы замечательными! Спасибо!

4b9b3361

Ответ 1

Проблема с forking, когда у вас есть некоторые потоки, заключается в том, что fork копирует только состояние процессора одного потока, который его вызывал. Как будто все остальные потоки просто умерли, мгновенно, где бы они ни находились.

В результате этого блокировки не освобождаются, и общие данные (например, куча malloc) могут быть повреждены.

pthread предлагает функцию pthread_atfork - теоретически вы можете использовать каждую блокировку в программе перед форкировкой, отпускать ее после и возможно, сделать это живым, но это рискованно, потому что вы всегда можете пропустить его. И, конечно же, стеки других потоков не будут освобождены.

Ответ 2

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

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