Если я выделяю память в одном потоке на С++, я могу выделить ее в другой

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

Существует много потенциальных технических проблем, с которыми вам, возможно, придется столкнуться. Многие компиляторы имеют многопоточные и однопоточные варианты библиотек времени выполнения, которые реализуют новые и удаляют, поэтому вы должны быть уверены, что используете правильный. (VS 2008 покончил с однопотоковым ЭЛТ, так что это не проблема.) Что еще более важно, ваше программное обеспечение должно быть спроектировано с нуля, чтобы быть многопоточным, и это самая большая проблема для нас. Ресурсы должны быть защищены, право собственности должно быть четким, и вам нужно избегать взаимоблокировок и условий гонки. Но в то время как это, вероятно, самая важная и сложная задача, с которой вы сталкиваетесь при распределении и освобождении в отдельном потоке, не имеет прямого отношения к вашему вопросу, поэтому я оставлю это для другого обсуждения.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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