Если я выделяю память в одном потоке на С++, я могу выделить ее в другой
Если я выделяю память в одном потоке в С++ (либо 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
он работает, потому что потоки принадлежат одному процессу и имеют одно и то же адресное пространство.