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

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

Править: Компиляторы, которые я в настоящее время использую, включают VS2003, VS2008 и Встроенный C++ 4.0, предназначаясь для XP, Vista, Windows 7 и различных ароматов Windows CE / PocketPC и Мобильный. Так в основном вся Microsoft, но через массив тайных платформ.

16
задан j0k 6 March 2013 в 16:54
поделиться

6 ответов

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

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

20
ответ дан 30 November 2019 в 17:52
поделиться

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

0
ответ дан 30 November 2019 в 17:52
поделиться

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

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

6
ответ дан 30 November 2019 в 17:52
поделиться

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

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

2
ответ дан 30 November 2019 в 17:52
поделиться

Извините за столь бесполезный ответ, но в стандарте C++ нет потоков, так что все ставки сделаны!

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

1
ответ дан 30 November 2019 в 17:52
поделиться

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

1
ответ дан 30 November 2019 в 17:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: