Межпроцессное взаимодействие: общая память и доступ к объекту потока

Я всегда знал, что разделяемая память - это самый быстрый способ обмена данными между двумя потоками (например, http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess.html). Однако сегодня я обнаружил, что с помощью boost::ref(X) можно дать boost ссылка на X обеспечение доступа к X извне нить Поэтому должен работать следующий псевдокод:

MyObjext X(para1,para2); // MyObject has a () operator
boost::thread thr(boost::ref(X));
X.setSomeMember(1);

Это заставило меня задуматься: предполагая setSomeMember в этом случае потокобезопасен - тогда для большинства приложений этот подход кажется гораздо более простым, поскольку большинство приложений порождают свои потоки по мере необходимости и, таким образом, всегда могут сохранить объект и получить к нему доступ X, Итак, зачем мне в любом случае использовать общую память или очереди сообщений, если у меня есть доступ к объекту потока напрямую? Это может быть быстрее? Или я что-то здесь упускаю?

1 ответ

Решение

Это просто разные функции - вы случайно обнаруживаете сходство.

Да, потоки легче, чем процессы.

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

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

В общем, все по-другому. Межпроцессная синхронизация / совместное использование имеет больший вес, но имеет больше возможностей (как вы будете запускать отдельный поток на другом хосте:)).

Другие вопросы по тегам