Имитирующая нить с вилкой () - PullRequest
6 голосов
/ 28 июля 2011

Что вы думаете об имитации thread с «функцией fork ()» и «разделяемой памятью» block ...

Возможно ли это?

Насколько разумно сделать это для программы?(Я имею в виду, это будет работать хорошо ..?)

Ответы [ 4 ]

4 голосов
/ 28 июля 2011

Для начала, не смешивайте поток и fork () .

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

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

2 голосов
/ 28 июля 2011

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

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

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

Если вы хотите работать с потоками, просто используйте поток.

1 голос
/ 28 июля 2011

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

И ответ: да, вы можете, но вы должны помнить, чтобы явно пометить, какие области памяти вы хотите использовать совместно. Вы не можете просто поделиться своими переменными между процессами. Кроме того, вы можете общаться таким образом между процессами, вообще не связанными друг с другом. Он не ограничен процессами, разветвленными друг от друга.

Посмотрите на разделяемую память или "shm" .

1 голос
/ 28 июля 2011

AFAIK, fork создаст отдельный процесс со своим собственным контекстом, стеком и так далее.Зависит от того, что вы подразумеваете под «симуляцией» ...

Возможно, вы захотите проверить это: http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them

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