Boost :: Thread или fork (): многопоточный HTTP-прокси - PullRequest
1 голос
/ 26 марта 2010

Я тестирую boost :: thread в системе.Бывает, что мне нужно было действовать как fork (), потому что один поток изменяет другие переменные, даже переменные-члены класса

Я делаю проект с использованием fork () или есть какая-то альтернатива, все еще использующая boost ::thread?

По сути, я запускаю эту программу в Linux и, возможно, FreeBSD.

Это http-прокси, accept () в главном потоке и функция, которая принимает класс (где естьсокет дескриптора файла) во вторичном потоке, который создает службу.

Есть ли лучший способ реализовать прокси?

Ответы [ 2 ]

4 голосов
/ 26 марта 2010

fork() порождает процесс , который имеет независимые области памяти. Изменено должно быть посредником через IPC.

boost::thread создает поток , который может совместно использовать память.

Они несопоставимы.


Чтобы создать локальное хранилище потока, используйте boost::thread_specific_ptr.

См. http://www.boost.org/doc/libs/1_42_0/doc/html/thread/thread_local_storage.html.

(Вы также можете декорировать глобальную переменную как __thread int xyz;, чтобы сделать ее локальной для потока, если архитектура компилятора и может ее поддерживать.)

2 голосов
/ 26 марта 2010

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

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

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

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