Если я выделю память в одном потоке в C ++, могу ли я перераспределить ее в другом - PullRequest
15 голосов
/ 02 марта 2010

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

Редактировать: Используемые в настоящее время компиляторы включают VS2003, VS2008 и Embedded C ++ 4.0, предназначенные для XP, Vista, Windows 7 и различных версий Windows CE / PocketPC & Mobile. Так что в основном все Microsoft, кроме множества эзотерических платформ.

Ответы [ 6 ]

19 голосов
/ 02 марта 2010

Как правило, malloc / new / free / delete в многопоточных системах является поточно-ориентированным, так что это не должно быть проблемой - и распределение в одном потоке, освобождение в другом - довольно распространенная вещь.

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

6 голосов
/ 02 марта 2010

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

Однако существует множество потенциальных технических проблем, с которыми вам, возможно, придется столкнуться. Многие компиляторы имеют многопоточные и однопоточные версии библиотек времени выполнения, которые реализуют new & delete, поэтому вы должны быть уверены, что используете правильный. (VS 2008 покончил с однопоточным CRT, так что это не проблема). Более того, ваше программное обеспечение должно быть разработано с нуля, чтобы оно поддерживало многопоточность, и это самая большая проблема для нас. Ресурсы должны быть защищены, право собственности должно быть ясным, и вы должны избегать тупиков и условий гонки. Но хотя это, пожалуй, самая важная и трудная задача, с которой вы сталкиваетесь при распределении и освобождении в отдельных потоках, это не имеет прямого отношения к вашему вопросу, поэтому я оставлю это для другого обсуждения.

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

Чтобы иметь возможность выделять в одном потоке и освобождать в другом, вам нужна библиотека времени выполнения, чтобы быть потокобезопасной. Все среды выполнения Microsoft были поточно-ориентированными, начиная с Visual Studio 2005, Visuals Studio 2003 предоставляет как однопоточные, так и поточно-безопасные среды выполнения - очевидно, вы должны выбрать соединение с многопоточными, если вы используете многопоточность.

Что касается того, является ли это законным, незаконным или зависит от реализации, я бы не сказал ничего из вышеперечисленного. Это полностью выходит за рамки стандарта, так как совсем не упоминает многопоточность.

1 голос
/ 02 марта 2010

Я полагаю, что это определяется реализацией, поскольку C ++ Standard ничего не говорит о том, как потоки будут совместно использовать адресное пространство.

1 голос
/ 02 марта 2010

Извините за этот бесполезный ответ, но C ++ Standard не имеет потоков, поэтому все ставки сняты!

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

0 голосов
/ 02 марта 2010

это работает, потому что потоки принадлежат одному и тому же процессу и используют одно и то же адресное пространство.

...