Синхронизация в многопоточной программе по сравнению между родительскими и дочерними процессами - PullRequest
0 голосов
/ 04 августа 2020

Как описано в заголовке. В чем разница между ними?

1 Ответ

0 голосов
/ 05 августа 2020

Хотя ваш вопрос не очень конкретный c, это то, что я считаю лучшим ответом на него:

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

Когда у вас есть родительский процесс и дочерний процесс, у вас есть два разных процесса, которые ничего не разделяют (ну, дочерний процесс зависит от родитель останется в живых, но это совсем другой разговор). Поскольку вы не можете напрямую изменять переменные другого процесса (как вы могли бы сделать с глобальной переменной ранее), для отправки данных от одного процесса к другому вам потребуется использовать другие методы, наиболее распространенными из которых являются каналы. Вы можете думать о каналах так же, как и о файлах: когда вы хотите отправить данные другому процессу, вы записываете данные в канал; когда вы хотите получить полученные данные от другого процесса, вы читаете данные из канала.

Вот ссылка с примерами работы каналов: https://www.geeksforgeeks.org/c-program-demonstrate-fork-and-pipe/ Вот ссылка с примерами того, как доступ к одним и тем же глобальным переменным в разных потоках работает: https://www.geeksforgeeks.org/multithreading-c-2/

Рад попытаться прояснить это, если у вас есть дополнительные вопросы / если это не отвечает на ваш вопрос

Изменить: для решения части «синхронизации»: в многопоточной программе вы можете использовать такие структуры, как мьютексы или барьеры, которые используются как глобальная переменная и легко доступны для всех потоков в вашем процессе. В многопроцессорной программе вам потребуется синхронизация, используя очень похожие методы, которые построены как слой абстракции над системой межпроцессного взаимодействия, о которой я говорил выше. Примером такого уровня абстракции является то, как MPI выполняет синхронизацию: https://mpitutorial.com/tutorials/mpi-broadcast-and-collective-communication/ Конечно, вы можете реализовать свои собственные функции по каналам.

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